javascript - 是否可以在闭包中使用外部定义的函数

标签 javascript closures

在下面的示例中,我可以调用 tester1(1,2) 并将“z”、“1”和“2”返回到控制台。

var labelTreeSorterClosureTest1 = function() {
    var zVar = "z";
    return function(a,b) { console.log(zVar), console.log(a), console.log(b) }
}
var tester1 = labelTreeSorterClosureTest1();

但是如果我想使用我在其他地方定义的函数怎么办,如下所示:

function externallyDefinedFunction(a,b) {
    console.log(zVar), console.log(a), console.log(b)
}
var labelTreeSorterClosureTest2 = function() {
    var zVar = "z";
    return externallyDefinedFunction;
}
var tester2 = labelTreeSorterClosureTest2();

如果我调用“tester2(1,2)”,我会收到一条错误消息,指出“z”未定义。我是否试图做一些没有意义的事情?

最佳答案

您需要了解闭包的工作原理。当调用一个方法时,上下文会切换到当前方法(与 c# 或 java 不同)以及与该函数相关的所有环境。因此,当它调用 externallyDefinedFunction (外部定义的)时,与您在第一个实例中返回的匿名函数不同(由于定义函数的作用域,它可以访问 zVar)。未定义 zVar。将 zVar 设为全局变量或解决错误,或传递 zVar 引用或共享 zVar 传递 externallyDefinedFunction 内的实例 labelTreeSorterClosureTest2 使用这个。

更新 你能做这样的事情吗?

function externallyDefinedFunction(zVar, a,b) {
    console.log(zVar), console.log(a), console.log(b)
}


var labelTreeSorterClosureTest1 = function() {
    var zVar = "z";
    return function(a,b) { 
      externallyDefinedFunction(zVar, a, b); 
    }
}

var tester2 = labelTreeSorterClosureTest2();
tester2(1,2);

关于javascript - 是否可以在闭包中使用外部定义的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19299832/

相关文章:

javascript - 在div内动态创建div和DOM元素的变量访问

ios - Swift 闭包作为字典中的值

javascript - 如果多个动画完成,如何从函数返回

Javascript do while、setTimeout、事件变量范围

swift - 在闭包中访问单例 = 内存泄漏?

javascript - 在悬停和单击链接时替换图像

recursion - Go 中的短变量声明和长变量声明之间的闭包范围区别是什么?

javascript - 正则表达式匹配任何一组数字,除了以 7 开头的 10 位数字

javascript - 路由获取参数和应用逻辑

javascript - html5 canvas stroke twice 再次绘制第一笔画