0%

JavaScript高级程序设计(红宝书)学习笔记 —— 持续更新

变量、作用域和内存问题

复制变量值

基本类型变量:创建一个新的变量,存放同样的值。

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

传递函数

JavaScript中函数传递参数是按值传递的。

执行环境及作用域

执行环境(有时简称“环境”)定义了变量和函数有权访问的其他数据,决定了他们各自的行为。每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。

全局执行环境是最外围的一个执行环境,在web浏览器中,全局执行环境被认为是window对象,因此所有全局变量和函数都是作为window对象的属性和方法创建的。

某个执行环境中的所有代码执行完毕后,该环境被销毁,保存在其中的所有变量和函数定义也随之销毁。全局执行环境在浏览器关闭后销毁。

每个函数都有自己的执行环境

当代码在一个环境中执行时,会创建变量对象的一个作用域链,其用途是保证对执行环境有权访问的所有变量和函数的有序访问。作用域链前端始终是当前执行的代码所在环境的变量对象末端始终是全局执行环境的变量对象

没有块级作用域

1
2
3
4
if (true) {
var color = "blue";
}
alert(color); //"blue"

在有块级作用域的语言中,color会在if执行完毕后被销毁,而在JavaScript中,if中声明的变量 会被添加到当前执行环境中(这里是全局执行环境)。 在使用for循环时尤其注意:

1
2
3
4
for (var i = 0; i < 10; i++){
dosomething(i);
}
alert(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 指向指定的那个对象
-------------本文结束感谢您的阅读-------------