javascrip高级程序设计的学习笔记【作用域和执行环境】

javascript变量可以用来保存两种类型的值:基本类型和引用类型。基本类型包括以下5种:undefined、Null、string、Boolean、Number等, 引用类型是object;基本类型和引用类型都具有几下特点:

1、基本类型值在内存中占据固定大小的空间,因此基本类型的值被保存在栈内存中;

2、从一个变量向另一个变量复制基本类型的值,会创建这个值的副本。

3、引用类型的值是对象,保存在堆中;

4、包含引用类型值的变量实际并不是包含对象本身,而是一个指向该对象的指针;

5、从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量始终指的同一个对象;

6、确定一个值是哪种基本类型可以用typeof操作符,而确定一个值是哪种引用类型可以用instanceof操作符‘;

var num1=5;
var num2=num1;
num2=6;
num2;//6
num1;// 5
var  obj1=new Object();
var obj2=obj1;
obj1.name="dd";
alert(obj2.name);//"dd" 指向的是同一个对象;地址相同n
var obj1=new Object();
var obj2=new Object();//两个对象,地址也不一样
var s="ddd";
var b=ture;
var c=22;
var u;
var n=null;
var 0=new function();
alert(typeof s);//string;
alert(typeof b);//boolean;
alert(typeof u);//undefined;
alert(typeof n);//object;
alert(typeof 0);//object;

确定是哪种引用类型时,用instanceof

alert(persons instanceif object);//变量person是object吗?
alert(colorss instanceif array);//变量colors是array吗?
alert(pattern instanceif RegExp);//变量pattern是RegExp吗?

函数的预处理(提升)

alert(a);
var a=123;//执行的结果是undefined;
程序相当于是: var a;
                   alert(a);
                   a=123;

函数的执行第一步要进行预处理,然后再一步步执行代码,看实例

<script type="text/javascript">
    alert(a);
    var a = 1;
    alert(a);
    function a(){alert(123);}
    alert(a);
    a();
</script>
第一步预编译
 var a;
  function a() {alert(123);}
第二步一步步执行代码:
     alert(a);//function a() {alert(123);}
     a=1;
    alert(a);//1
    alert(a)://1
    a();//报错,相当于1();

js没有按引用传参的功能,切忌,不能把传递引用参数当做按引用传参

function setName(obj){
          obj.name="dddd";
}
var person=new object();
setName(person);
alert(person,name);//ddd这里是按质传参的

同级函数的作用域不是嵌套的,不能访问

function f1(){
   var b=2;
   alert(b);
    f2();
}
function f2()
{
    var d=3;
    alert(d);
    alert(b);//不出现b
}

但是如果是这样的嵌套函数f2()嵌套在f1()作用域中,f1()作用域嵌套在全局作用域中,形成了作用域链;

function f1(){
   var b=2;
   alert(b);
    function f2()
  {
    var d=3;
    alert(d);
    alert(b);//2
  }
}

for语句和if语句没有封闭作用域的功能,都是全局的

所有变量都存在于一个执行环境(也称作用域)当中,这个环境决定了变量的生命周期,以及哪部分代码可以访问其中的代码,以下是总结:

1、执行环境有全局执行环境和函数执行环境之分;

2、每一次进入一个新的执行环境,都会创建一个用于搜索变量和函数的作用域链;

3、函数的局部环境不仅有访问函数作用域中的变量,而且有权访问其包含(父类)环境、乃至全局环境;

4、全局环境智能访问在全局环境中定义的变量和函数,而不能直接访问局部环境中的任何数据;

5、变量的执行环境有助于确定如何释放内存;

javascript语言是一门具有自动垃圾收集机制的编程语言,开发人员不必关心内存分配和回收问题:可以对javascript的垃圾收例程作如下总结;

1、 离开作用域的值将自动标记为可以回收,因此将在垃圾收集期间被删除;

2、“标记清除”是目前流行的垃圾收集算法,这种算法的思想是给当前不使用的值加上标记,然后再将其回收

3、解除变量的引用不仅有助于消除循环引用对象,而且对垃圾收集也有好处,为了确保有效地回收内存,应该及时解除不再使用的全局对象,全局对象属性以及循环引用变量的引用;

function  createPerson(name){
    var localPerson=new Object();
   localPerson.name=name;
   return localPerson;
}
var  dd=createPerson("dddd");
dd=null;//手工解除dd的引用
时间: 2024-10-13 14:37:48

javascrip高级程序设计的学习笔记【作用域和执行环境】的相关文章

《JavaScript高级程序设计》学习笔记(5)——面向对象编程

欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 本节内容对应<JavaScript高级程序设计>的第六章内容. 1.面向对象(Object-Oriented, OO)的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象.前面提到过,ECMAScript中没有类的概念,因此它的对象也与基于类的语言中的对象有所不同. ECMA-262把对象定义为:"无序属性的集合,其属性可以包含基本值.对象或者函数.

《JavaScript高级程序设计》学习笔记(4)——引用类型

欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 本节内容对应<JavaScript高级程序设计>的第五章内容. 在ECMAScript中,引用类型是一种数据结构,用于将数据和功能组织在一起,通常也被称为类,有时候也被成为对象定义,因为他们描述的是一类对象所具有的属性和方法.对象是某个特定引用类型的实例,新对象是使用new操作符后跟一个构造函数来创建的, var person = new Object() ; 创建了一个object对象.构造函数

《JavaScript高级程序设计》学习笔记 基本概念

系统学习JS, 从<JavaScript高级程序设计>入门,通过学习jQuery或者angularJS源码来进阶. 第1章 JavaScript简介 1.JS问世的目的是处理以前由服务器端语言(如Perl)负责的一些输入验证操作,由Netscape主导开发,那时候微软的IE还不能独领风骚.最初叫做LiveScript,当时媒体热炒Java,于是改名为JavaScript.JavaScript和ECMAScript通常指同一门语言,但是,JavaScript是ECMA-262标准的实现和扩展.E

《JavaScript高级程序设计》学习笔记12篇

写在前面: 这12篇博文不是给人看的,而是用来查的,忘记了什么基础知识,点开页面Ctrl + F关键字就好了 P.S.如果在对应分类里没有找到,麻烦告诉我,以便尽快添上.当然,我也会时不时地添点遗漏的东西进去 目录 JS学习笔记1_基础与常识 JS学习笔记2_面向对象 JS学习笔记3_函数表达式 JS学习笔记4_BOM JS学习笔记5_DOM JS学习笔记6_事件 JS学习笔记7_表单脚本 JS学习笔记8_错误处理 JS学习笔记9_JSON JS学习笔记10_Ajax JS学习笔记11_高级技巧

1 《JavaScript高级程序设计》学习笔记(1)

欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 首先,我将从<JavaScript高级程序设计>这本JavaScript学习者必看的经典教程开始,JavaScript的很多语法规则及习惯用法和Java极其相似,因此对于有Java基础的学习者来说,JS是很容易上手的.该系列的每次更新将对应原书的一章内容,本次更新对应原书的第三章,主要是一些基本概念,内容很简单, 知识点也较少. 1.和一般的编程语言一样,标识符可以由字母.数字.下划线和美元符组成

《AngularJS高级程序设计》学习笔记

  一.AngularJS应用剖析 AngularJS存在一些最主要的构件,如模型,视图和控制器.但AngularJS中也有许多其他可供灵活使用的部件,包括模块,指令,过滤器,工厂和服务. 一 . 1 依赖注入 没有依赖注入(dependencies injector),就不得不以某种方式找到自己所需要的组件,很可能得使用到全局变量.虽然这样子也能工作,但是不如AngularJS的依赖注入来的简单.依赖注入,可以通过让某个组件的工厂函数的参数上声明依赖来实现,这个函数使用参数来提出需求: "He

《JavaScript高级程序设计》学习笔记(2)--JS运算符详解

欢迎关注本人的微信公众号"前端小填填",专注前端技术的基础和项目开发的学习. 思维导图 前面对JS的运算符的操作很多细节的东西没有提及,今天给大家分享一张网上找的思维导图,对这一部分做一个详细的补充,小编觉得总结得还算很到位的:

JavaScript高级程序设计6学习笔记之面向对象程序设计

首先 JavaScript是没有类这个概念的 ECMA-262把对象定义为:“无序属性的集合,其属性可以包含基本值,对象或者函数” 创建对象的方法: var person = new Object(); person.name = "niko"; person.age = 20; person.say = function(){alert(this.name);}; 上面的例子用对象字面量语法可以写为: var Person = { name : "niko"; a

JavaScript高级程序设计(学习笔记)

第13章 事件 一.事件 1.1事件冒泡:事件发生时从里面向外传播   如:div>body>html>document 1.2事件捕获:事件发生时从外层向里层传播   如  document>html>body>div 1.3  DOM事件流是三个阶段:事件捕获,处于目标阶段 事件冒泡 二.事件处理程序 2.1 html事件处理程序 1.event  通过event变量可以直接访问事件对象,不用自己定义也不用从函数中读取, This  this的值等于事件的目标 三.