Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
词汇范围欺骗Javascript_Javascript_Closures - Fatal编程技术网

词汇范围欺骗Javascript

词汇范围欺骗Javascript,javascript,closures,Javascript,Closures,有人能用JavaScript解释这种奇怪的行为吗: var x = 1; function f (y) {return x + y;} console.log(f(5)); // prints 6 x = 2; console.log(f(5)); // prints 7 基于词法范围和闭包,我希望每次打印6,因为f中的x被缓存为等于1,对吗?f函数捕获对x的引用。它不捕获当前值。每个函数定义一个变量范围。变量作用域有一个指向其外部函数作用域的隐式链接,该函数作用域有一个指向其外部作用域的

有人能用JavaScript解释这种奇怪的行为吗:

var x = 1;
function f (y) {return x + y;}
console.log(f(5));  // prints 6
x = 2;
console.log(f(5));  // prints 7

基于词法范围和闭包,我希望每次打印6,因为f中的x被缓存为等于1,对吗?

f函数捕获对x的引用。它不捕获当前值。每个函数定义一个变量范围。变量作用域有一个指向其外部函数作用域的隐式链接,该函数作用域有一个指向其外部作用域的链接。。。直到你进入全球范围。因此,当函数引用变量时,它会在自己的范围内查找它。如果找不到它,它会在其直接的外部作用域中查找它,并继续搜索直到全局作用域,如果在全局作用域中找不到它,它会抛出ReferenceError。因此,给定范围内的变量将在外部范围内对具有相同名称的变量进行阴影处理。因此,var variable=localshadows var variable=top-level……闭包的关键是函数保持与定义函数的外部作用域的链接。因此,即使将函数传递到不同的作用域,变量作用域链也不会改变。它的行为就像是在它诞生的地方被调用一样。尽管我倾向于将其视为对整个变量环境的绑定,而不是对单个变量的绑定。词汇环境在创建函数调用时链接在一起,并在其生命周期中保持该链接。因此,您最内部的函数实际上可以使用eval以动态/随机的方式定义要读取的外部变量,如果该变量存在于某个封闭范围内,它将始终找到它。也就是说。。。现代JS引擎通常会优化以释放闭包未引用的变量。使用eval将禁用此类优化。。。。它使用eval动态确定要访问的变量。由于没有从最内层函数显式引用外部变量,它仍然可以读取外部变量,因为它链接到整个环境。