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

阿萨德·伊克巴尔(Asad Iqbal)

我有一个使用匿名函数的代码,我想对其进行测试。该代码遵循以下结构(所有功能都在一个大图中)。但是,当我将匿名函数重构为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引用变量name,但未在该函数或任何周围的函数中定义它,因此未将其保存在闭包中。与此相比,在匿名函数hello1和命名函数f1hello2-hello1hello2各自定义一个局部变量name,并封闭功能,可以参考它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么我不能在列表中使用匿名函数?

为什么我不能在 React 中调用这个函数?

为什么我不能在这个函数的循环之外定义一个计数变量(C++)

为什么我不能在 cookie.get 函数之外使用 cookie 变量值?

为什么我不能在 jasmine 的 expectAsync 中使用匿名函数?

为什么在javascript中我不能在这个函数中创建对象?

为什么我不能在这个草率模式函数中访问arguments.callee?

为什么我不能在 Python 中使用变量作为参数来调用这个函数?

为什么我不能引用我的匿名函数?

为什么我不能在d3 then函数之外通过索引访问我的JavaScript数组?

为什么我不能在addEventListener中调用类函数

为什么我不能在熊猫函数中应用shift?

为什么我不能在函数内使用引号

为什么我的函数不能在.resize()上运行?

为什么我不能在函数的外侧定义后跟 =?

为什么我的while函数不能在Python上运行?

为什么我不能在Matlab中使用函数readframe

为什么我的函数不能在 python 代码中执行?

为什么我不能用 lambda 替换这个函数

为什么我不能消除这个箭头函数?

为什么不能在线程宏中使用匿名函数?

为什么不能在函数参数列表中使用匿名对象作为参数?C ++

为什么这个变量不是全局变量(不能在函数中使用)?

为什么我不能在方法之外调用变量?

为什么我不能在方法之外创建实例

为什么我不能在匿名类中使用<Class> .this?

为什么 lambda 不能使封闭函数返回?

为什么我不能在两个渲染函数中传递一个函数?

为什么我们不能在main函数中定义函数?