执行上下文和闭合 - 特定代码的问题 [重复]

问题描述 投票:-1回答:1
 1. function  test(language){
 2.   return function(set){
 3.       if(set)
 4.           {
 5.       language=set;
 6.       console.log("Changed "+language);
 7.           }
 8.       else
 9.           {
 10.               console.log(language);
 11.           }
 12.   }
 13. }
 14.
 15. var a=test("en");
 16. var b=test("es");
 17. a("Spanish");
 18. a();
 19. b();

这里,第17行和第18行的执行上下文是分开的,但将创建的闭包将引用同一个 "语言 "实例,因为第15行中返回了一个函数,该函数在闭包中具有相同的 "语言"。现在,第18行将有一个不同的执行上下文和不同的语言实例,因为第16行中的函数 "test "的初始化不同。所以,输出将是

Changed Spanish
Spanish
es

但现在

 1. function  test(){ language = "English"
 2.   return function(set){
 3.       if(set)
 4.           {
 5.       language=set;
 6.       console.log("Changed "+language);
 7.           }
 8.       else
 9.           {
 10.               console.log(language);
 11.           }
 12.   }
 13. }
 14.
 15. var a=test();
 16. var b=test();
 17. a("Spanish");
 18. a();
 19. b();

这里第17行和第18行的执行上下文不同,但 "语言 "的实例相同。但是 "a "和 "b "变量的闭包会有不同的 "语言 "实例,就像前面的例子一样,即使 "a "把值改成 "西班牙语",当 "b "被调用时,显示的值仍然是 "es",因为b的 "语言 "和a的 "语言 "不同。但在这里,当我检查输出时,当我在第17行将a的语言改为 "西班牙语 "时,b的 "语言 "也发生了变化,给我的输出如下。

Changed Spanish
Spanish
Spanish

现在,第一行和第二行都可以理解了 因为在所有 "a "函数的调用中都有相同的 "语言 "实例 就像第一个例子一样 但是b的闭包肯定有不同的语言实例 那为什么输出不是如下。

Changed Spanish
Spanish
English
javascript closures
1个回答
0
投票

答案就在于不使用关键字来声明变量的概念。var 在第二段代码的第1行。在其他资源上发现,如果我们按原样声明变量,它是在全局上下文中声明的。

修改代码如下。

 1. function  test(){ var language = "English"
 2.   return function(set){
 3.       if(set)
 4.           {
 5.       language=set;
 6.       console.log("Changed "+language);
 7.           }
 8.       else
 9.           {
 10.               console.log(language);
 11.           }
 12.   }
 13. }
 14.
 15. var a=test();
 16. var b=test();
 17. a("Spanish");
 18. a();
 19. b();
 20. console.log(this.language)

我在代码中增加了额外的第20行,以证明该变量不存在于窗口作用域中,因此上述代码片段的输出如下。

Changed Spanish
Spanish
English
undefined

在问题的第二个代码片段中,"语言 "变量存在于全局范围内,因此它将返回 "西班牙语",而不是未定义。

© www.soinside.com 2019 - 2024. All rights reserved.