嗨,我正在读这本书系列"You Don't Know JS"。我正在第二次通过,我试图更深入地了解内容。在讨论范围和闭包的章节时。我遇到以下情况:
考虑这个例子
function test1(){
var a = 2;
return function(){console.log(a)};
}
var b = test1();
b(); // 2
var c = test1();
c(); // 2
“test()”返回的函数在“test”范围内保持闭包。所以每次调用这个返回函数时,我们得到变量“a”的值,在这种情况下是“2”。现在考虑这个例子:
function test2() {
var a = Date.now();
return function() {console.log(a)}
}
var b = test2();
b(); // 1551867093995
var c = test2();
c(); // 1551867109249
每次执行“test()”时,变量“a”被赋予调用函数“test()”的时间,并返回一个在“test()”范围内保持闭包的函数。
我们在两个单独的实例上调用“test()”,将返回的函数分配给变量“b”和“c”。
注意,当我们调用“b()”和“c()”时,即使每个调用引用同一范围内的相同变量(var a),我们也会得到2个不同的值。
似乎每次调用一个函数(例如“test2()”)时,引擎都会为每个函数调用创建一个声明函数作用域的唯一实例,并且无论何种闭包存在,都会关闭函数作用域的唯一实例。 。就好像每个函数声明创建一个描述其自身范围的“Scope类”,并且每次调用该函数时,都会创建该“范围类”的实例。这是真的吗?有人可以解释这种行为或指向我更深入解释JavaScript范围的资源吗?
谢谢
每次调用test2
时,引擎都会创建一个新的闭包。
如果要重用相同的闭包,则还必须使用相同的变量:
function test2() {
var a = Date.now();
return function() {console.log(a)}
}
var b = test2();
b();
b(); // the same