0

以下の例では、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」が未定義であるというエラーが表示されます。意味のないことをしようとしていますか?

4

2 に答える 2

2

クロージャーがどのように機能するかを理解する必要があります。メソッドが呼び出されると、その関数に関連するすべての環境とともに、コンテキストが現在のメソッド (c# や Java とは異なります) に切り替えられます。したがって、最初のインスタンスで返す匿名関数 (関数が定義されたスコープのためにzVarexternallyDefinedFunctionにアクセスできる) とは異なり、(外部で定義された)呼び出しに行くとき、定義されたものはありません。グローバル変数を作成するか、エラーを解決するか、zVar 参照を渡すか、zVar を共有して、これを使用して内部のインスタンスを渡します。zVarzVarlabelTreeSorterClosureTest2externallyDefinedFunction

UPDATE あなたはこのようなことができますか?

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);
于 2013-10-10T15:25:16.587 に答える