Javascript 为什么可以';我不能在封闭函数之外重构这个匿名函数吗?

Javascript 为什么可以';我不能在封闭函数之外重构这个匿名函数吗?,javascript,closures,Javascript,Closures,我有一个使用匿名函数的代码,我想测试它。代码遵循以下结构(所有函数都在一个大图中)。但是,当我将匿名函数重构为一个单独的函数f2在较大的函数hello3之外时,正如我所期望的那样,该值不会被传递。为什么会这样? 我可以将该值作为参数传递,但是我也想了解基本原理 var bigMap = { f2: function() { console.log("Closed over:" + name); }, hello1: function(name) { return functi

我有一个使用匿名函数的代码,我想测试它。代码遵循以下结构(所有函数都在一个大图中)。但是,当我将匿名函数重构为一个单独的函数
f2
在较大的函数
hello3
之外时,正如我所期望的那样,该值不会被传递。为什么会这样? 我可以将该值作为参数传递,但是我也想了解基本原理

var bigMap = {
f2: function() {
    console.log("Closed over:" + name);
},

hello1: function(name) {
     return function() {
        console.log("Closed over:" + name);
    };
},

hello2:function(name) {
    var f1 = function() {
        console.log("Closed over:" + name);
    };
    return f1;
},


hello3:function(name) {
    return this.f2;
}
};

var f = bigMap.hello1("asad");
f(); // Outputs> Closed over:asad
f = bigMap.hello2("asad");
f(); // Outputs> Closed over:asad
f = bigMap.hello3   ("asad");
f(); // Outputs> Closed over: 

这与其说是关于可测试性,不如说是关于常规js变量范围。您不能在任何地方引用空单词f2,因为它是对象“bigMap”的属性。换句话说,如果您只是将“return f2”更改为“return bigMap.f2”,它将返回函数f2。

这与其说是关于可测试性,不如说是关于常规js变量范围。您不能在任何地方引用空单词f2,因为它是对象“bigMap”的属性。换句话说,如果您只是将“return f2”更改为“return bigMap.f2”,它将返回函数f2。

JS函数是词法闭包。这意味着它们只关闭在函数定义周围的函数范围中定义的变量

f2
引用变量
name
,但该变量未在该函数或任何周围函数中定义,因此未保存在闭包中。将其与
hello1
中的匿名函数和
hello2
中的命名函数
f1
进行比较--
hello1
hello2
分别定义了一个局部变量
name
,所包含的函数可以引用它。


f2
引用变量
name
,但该变量未在该函数或任何周围函数中定义,因此未保存在闭包中。将其与
hello1
中的匿名函数和
hello2
中的命名函数
f1
进行比较--
hello1
hello2
分别定义了一个局部变量
name
,所包含的函数可以引用它。

这不是该代码输出的结果<代码>f2需要使用
this.f2
引用。这不是该代码输出的内容
f2
需要使用
this.f2
引用。谢谢@Stephan,这是一个代码错误;我已经在本地更正了它,但是在(现在更正的)问题中粘贴了旧版本;我已经在本地更正了它,但在(现在更正的)问题中粘贴了旧版本。Javascript中的变量提升可能很棘手-我喜欢使用博客帖子提醒自己细节。Javascript中的变量提升可能很棘手-我喜欢使用博客帖子提醒自己细节。