javascript - 为什么我不能在封闭函数之外重构这个匿名函数?

标签 javascript closures

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

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 引用变量 name,但它没有在该函数或任何周围函数中定义,因此它不会保存在闭包中。将其与 hello1 中的匿名函数和 hello2 中的命名函数 f1 进行比较 - hello1 hello2各定义一个局部变量name,内含的函数可以引用它。

关于javascript - 为什么我不能在封闭函数之外重构这个匿名函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17499240/

相关文章:

javascript - 为什么 JS 计算属性语法允许赋值表达式?

javascript - 将数据从 main 传递到渲染器 (electron-js)

python 风格 : inline function that needs no inlining?

class - Swift 类省略带闭包的括号 : syntactic sugar or something else?

javascript - 单击元素或其子项时如何获取元素的数据属性

javascript - Jquery删除前置元素后的元素

javascript - onblur 不工作但 onclick 是

php - 在 php 7.4 中重写匿名函数

multithreading - sync::mpsc 意外关闭 channel

JavaScript 变量作用域