• 闭包指的是那些引用了另一个函数作用域中变量的函数
  • 在调用一个函数时,会为这个函数调用创建一个执行上下文,并创建一个作用域链。然后用arguments和其他命名参数来初始化这个函数的活动对象。外部函数的活动对象是内部函数作用域链上的第二个对像。这个作用域链一直向外串起了所有包含函数的活动对象,直到全局执行上下文才终止。

this对象

  • 如果内部函数没有使用箭头函数定义,则this对象会在运行时绑定到执行函数的上下文。
  • 在全局函数中调用,则this在非严格模式下等于window,严格模式下等于underfined。
  • 函数在被调用时都会自动创建两个特殊变量: this 和arguments。内部函数永远不可能直接访问外部函数的这两个变量。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
window.identity = 'The Window'; 
let object = {
identity: 'My Object',
getIdentityFunc() {
return function() {
return this.identity;
};
}
};
console.log(object.getIdentityFunc()()); // 'The Window'
//=============================
window.identity = 'The Window';
let object = {
identity: 'My Object',
getIdentityFunc() {
let that = this;
return function() {
return that.identity;
};
}
};
console.log(object.getIdentityFunc()()); // 'My Object'
1
2
3
4
5
6
7
8
9
10
window.identity = 'The Window'; 
let object = {
identity: 'My Object',
getIdentity () {
return this.identity;
}
};
object.getIdentity(); // 'My Object'
(object.getIdentity)(); // 'My Object'
(object.getIdentity = object.getIdentity)(); // 'The Window'
  • 第一行调用object.getIdentity()是正常调用,会返回”My object”, 因为this.identity就是object.identity。
  • 第二行在调用时把object.getIdentity放在了括号里。虽然加了括号之后看起来是对一个函数的引用,但this值并没有变。这是因为按照规范,object.getIdentity和(object.get Identity)是相等的
  • 第三行执行了一次赋值,然后再调用赋值后的结果。因为赋值表达式的值是函数本身。this值不再与任何对象绑定,所以返回的是”The Window”。