变量、作用域和内存问题
复制变量值
基本类型变量:创建一个新的变量,存放同样的值。

引用类型变量:创建一个新的变量,存放同样的引用(指针),指向同一个对象。

传递函数
JavaScript中函数传递参数是按值传递的。
执行环境及作用域
执行环境(有时简称“环境”)定义了变量和函数有权访问的其他数据,决定了他们各自的行为。每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。
全局执行环境是最外围的一个执行环境,在web浏览器中,全局执行环境被认为是window对象,因此所有全局变量和函数都是作为window对象的属性和方法创建的。
某个执行环境中的所有代码执行完毕后,该环境被销毁,保存在其中的所有变量和函数定义也随之销毁。全局执行环境在浏览器关闭后销毁。
每个函数都有自己的执行环境。
当代码在一个环境中执行时,会创建变量对象的一个作用域链,其用途是保证对执行环境有权访问的所有变量和函数的有序访问。作用域链的前端始终是当前执行的代码所在环境的变量对象,末端始终是全局执行环境的变量对象。
没有块级作用域
1 | if (true) { |
在有块级作用域的语言中,color会在if执行完毕后被销毁,而在JavaScript中,if中声明的变量 会被添加到当前执行环境中(这里是全局执行环境)。 在使用for循环时尤其注意:
1 | for (var i = 0; i < 10; i++){ |
对于有块级作用域的语言,i会在for循环结束后销毁,而在JavaScript中,i在for循环结束后,也依旧会存在于循环外部的执行环境中。
变量声明
使用var
声明,变量会被添加到最近的执行环境中,而如果不使用var
,变量会被添加到全局执行环境中。
查询标识符
从当前执行环境开始一级一级向上搜寻,直到找到为止,若找不到,则判断为未定义。
this的指向
根据函数的调用方式的不同,this 会指向不同的对象:
- 1.以函数的形式(包括普通函数、定时器函数、立即执行函数)调用时,this 的指向永远都是 window。比如
fun();
相当于window.fun();
- 2.以方法的形式调用时,this 指向调用方法的那个对象
- 3.以构造函数的形式调用时,this 指向实例对象
- 4.以事件绑定函数的形式调用时,this 指向绑定事件的对象
- 5.使用 call 和 apply 调用时,this 指向指定的那个对象