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

问题描述 投票:0回答:1

嗨,我正在读这本书系列"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范围的资源吗?

谢谢

javascript function scope closures internals
1个回答
0
投票

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

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

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

var b = test2();
b();
b(); // the same
© www.soinside.com 2019 - 2024. All rights reserved.