作弊小技巧:一招判断this所属上下文
Javascript的函数闭包,就是在调用函数时,通过返回一个携带该函数上下文的环境,获取本不可以被外部访问的数据。
下面是一个例子:
// Example 1
function a () {
let x = 1
a.__proto__.add = ()=> x++
return function(){return x}
}
const x = a() // => ƒ (){return x}
x() // => 1
a.add() // or x.add()
x() // => 2
注意⚠️:正常的函数在执行完毕后,会通过GC回收函数里被创建的资源。但是因为通过返回函数闭包(包含函数上下文),导致在函数中创建的所有变量(即使它们原本的目的只是作为临时变量)都被保存了下来。
上下文
闭包由于有被执行函数的完整上下文,所以可以通过
// Example 2
function b () {
const x = 1
this.value = function (){return x}
return this
}
b().x // => undefined
b().value() // => 1
由于变量
接下来,我们把问题复杂化一点,看下面这个例子,来感受一下上下文
// Example 3
function b () {
b.x = 1
b.__proto__.value = function (){return this.x}
return function () {
this.x = 2
return this
}
}
const a = b() // => ƒ () { this.x = 2; return this }
a.x = 123
a.value() // => 123
b.value() // => 1
执行
通过这个规律,我们其实可以发现,
- 而特别地:
a().x // => 2
new a() // => {x: 2}
1.当直接调用函数时(
2.使用