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

Javascript 是否可以在闭包中使用外部定义的函数,javascript,closures,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(); 但如果我想使用我在别处

在下面的示例中,我可以调用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不同)以及与该函数相关的所有环境。因此,当它调用
外部定义的DefinedFunction
(外部定义)时,与您在第一个实例中返回的匿名函数不同(由于定义函数的范围,匿名函数可以访问zVar)。,没有定义
zVar
。使用此函数将
zVar
设为全局变量,或解决错误,或传递zVar引用,或共享zVar传递实例
LabelTreeSortCorLosureTreset2
内部
外部定义函数

更新 你能这样做吗

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);

在第二个示例中,
externallyDefinedFunction
声明不在定义
zVar
的范围内。这就是为什么会出现错误的原因。感谢papirtiger的示例,但我的目标是从函数外部设置externallyDefinedFunction中zVar的值。这意味着我可以编写一次externallyDefinedFunction,并通过一个具有不同zVar值的闭包调用它。这似乎是不可能的,但是…谢谢你提供的信息。我的目标是从函数外部设置externallyDefinedFunction中zVar的值。这意味着我可以编写一次externallyDefinedFunction,并通过一个具有不同zVar值的闭包调用它。从你所说的听起来这是不可能实现的?老实说,我不知道。但是你可以试试这样的东西。查看我的更新
function externallyDefinedFunction(a,b) {
    // this variable is in the scope of the returned function
    var zVar = "in externallyDefinedFunction";
    console.log(zVar), console.log(a), console.log(b)
}
var labelTreeSorterClosureTest2 = function() {
    // this variable is private to the scope of labelTreeSorterClosureTest2
    var zVar = "i will never be seen!";
    return externallyDefinedFunction;
}
var tester2 = labelTreeSorterClosureTest2();