变量、作用域和内存问题的一些笔记

4.1 基本类型和引用类型的值

ECMAScript变量包含两种不同数据类型的值:基本类型值和引用类型值。基本类型值指的是简单的数据段,引用类型值指那些可能由多个值构成的对象。
5种基本数据类型:Undefine, Null, Bollean, Number, String(!)。它们是按值访问的,因为可以操作保存在变量中的实际的值。
引用类型的值是保存在内存中的对象。引用类型的值是按引用访问的。Javascript不允许直接访问内存中的位置,不能直接操作对象的内存空间。操作对象时,操作的时对象的引用。

4.1.1 动态的属性

对于引用类型的值,我们可以为其添加属性和方法,也可以改变和删除。
不能给基本类型的值添加属性,这不会导致任何错误,但是毫无意义。

4.1.2 复制变量值

如果从一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,然后复制到新变量分配的位置上。它们之间将毫无关系,互不影响。
当从一个变量向另一个变量复制引用类型的值时,复制的是指针,它们将引用同一个对象,对其中一个对象的改变会影响另外一个。

4.1.3 传递参数

ECMAScript中所有函数的参数都是按值传递的。传递基本类型和传递引用类型都是按值传递。只不过引用类型传递的是指针,所以函数对对象的影响会影响到函数外部。

4.1.4 检测类型

typeof操作符
返回数据类型。
instanceof操作符
检查对象是什么类型的。
variable instanceof constructor

4.2 执行环境及作用域

执行环境(execution context),简称环境,定义了变量或函数有权访问的其他数据。每个环境有一个与之关联的变量对象,包含所有环境中定义的变量和函数。
Web浏览器的全局执行环境是window对象。关闭网页或浏览器时,全局执行环境销毁。
每个函数都有自己的执行环境。执行流进入一个函数,函数的环境会被推入一个环境栈中。执行完后,栈将环境弹出,控制权还给之前的执行环境。
当代码在一个环境中执行时,会创建变量对象的一个作用域链。它保证对执行环境有权访问的所有变量的有序访问。作用域链的前端,始终是当前执行的代码所在环境的变量对象。如果这个环境是函数,则将其活动对象作为变量对象。活动对象最开始只包含arguments对象(即参数),下一个对象来自他的第一个外部环境,以此类推,作用域链的最后一个对象是全局执行环境。
标识符解析会沿着作用域链一级一级搜索标识符,从前端开始。

4.2.1 延长作用域链

  1. try-catch语句的catch块
  2. with语句
    它们会在作用域链的前端添加一个变量对象。

4.2.2 没有块级作用域链

JavaScript中没有块级作用域(花括号封闭的代码块)。比如for循环之后的n将会保存其循环结束时的值。

4.2.2.1
使用var声明的变量会自动被添加到最接近的环境中,比如函数就是函数的局部环境。
如果没有用var声明,将会被添加到全局环境中。
我们在使用一个变量之前,应该用var声明。

posted @ 2018-01-31 23:04  xzhx  阅读(128)  评论(0编辑  收藏  举报