在下面的示例中,我可以调用 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/