JavaScript,同一个函数的单独实例为同一个封闭变量返回不同的值

时间:2019-03-06 11:16:36

标签: javascript function scope closures internals

您好,我正在阅读"You Don't Know JS"系列丛书。我正在第二遍尝试对内容进行更深入的了解。在讨论有关范围和闭包的章节时。我想到了以下情况:

考虑此示例

int[][] data2d = {data, data, data, data, data, data, data, data}

从“ test()”返回的函数在“ test”的范围内保持关闭状态。因此,每次调用此返回函数时,我们都会获得变量“ a”的值,在这种情况下为“ 2”。现在考虑以下示例:

function test1(){
  var a = 2;
  return function(){console.log(a)};
}

var b = test1();
b();   // 2
var c = test1();
c();   // 2

每次执行“ test()”时,都会在调用函数“ test()”时分配变量“ a”,并返回一个在“ test()”范围内保持闭合的函数。

我们在两个单独的实例上调用“ test()”,将返回的函数分配给变量“ b”和“ c”。

注意,当我们调用“ b()”和“ c()”时,即使每次调用都引用了同一范围(var a)中的相同变量,我们也会获得2个不同的值。

似乎每次我们调用一个函数(例如“ test2()”)时,引擎都会为该函数的每次调用创建一个已声明函数作用域的唯一实例,无论存在哪种闭包,都会在的唯一实例上关闭功能范围。就像每个函数声明都创建了一个“ Scope类”来描述其自己的范围一样,并且每次调用该函数时,都会创建该“ scope class”的实例。真的是这样吗?有人可以解释这种行为还是将我指向可以更深入地说明JavaScript作用域的资源?

谢谢

1 个答案:

答案 0 :(得分:0)

每次调用test2时,引擎都会创建一个新的闭包。

如果要重复使用相同的闭包,则还必须使用相同的变量:

function test2() {
  var a = Date.now();
  return function() {console.log(a)}
}

var b = test2();
b();
b(); // the same