私はこのアラートが真実である理由を理解しようとしていますか?コールバック関数(可能な場合)に引数を渡さずに、私がfalseを警告する方法は?コールバックのスコープを実行する場所に設定していますか?
var a = true;
function foo(callback){
var a = false;
callback();
}
function bar(){
alert(a);
}
foo(bar); // Alerts true
私はこのアラートが真実である理由を理解しようとしていますか?コールバック関数(可能な場合)に引数を渡さずに、私がfalseを警告する方法は?コールバックのスコープを実行する場所に設定していますか?
var a = true;
function foo(callback){
var a = false;
callback();
}
function bar(){
alert(a);
}
foo(bar); // Alerts true
この:
var a = false;
は... foo
関数のスコープに対してローカルです。
この:
function bar(){
alert(a);
}
... a = true
変数のスコープで作成し、そのように、そのローカル変数環境を超えるので、その具体的なa
変数の上に閉鎖されました。
ファンクションを作成するたびに、には、が作成された変数スコープが永続的に保持されます。
この関数を別の環境に渡すかどうかは関係ありません。常に元の変数環境のみを参照します。 foo
にローカル変数を参照するためにbar
ためには
、あなたが引数としてbar
にそれらを渡すことができます:
var test0 = 0; // global variable environment
function a() {
var test1 = 1; // "a()" will always retain the global environment even if you
// send "a()" somewhere else
function b() {
var test2 = 2; // "b()" will always retain the environment of "a()" and the
// global environment, even if you send "b()" somewhere else
}
}
EDIT
var a = true;
function foo(callback){
var a = false;
callback(a);
}
function bar(a){
alert(a);
}
foo(bar); // now it alerts false
... bar()
のパラメータには、グローバルa
という変数と同じ名前が付けられています。関数のパラメータは、関数自身の変数環境外の変数の前に読み込まれるため、a
パラメータは「シャドウ」グローバルa
変数です。
このように、bar
からグローバルa
を読み取ることはできません。もちろん、arg
などのパラメータの名前を変更して、ローカルarg
パラメータとグローバルa
変数の両方を参照できるようにするだけでよいでしょう。
あなたが新しいを作成a = false
を言うときあなたはvar
を使用しているので、ローカルa
、スコープ。
より広い範囲で既存の変数を変更する場合は、var
を削除してください。
私が探していたものです。とにかく、fooのローカルスコープでコールバックを実行することはありますか? – user654616
@ user654616:ようこそ。 – user113716
@ user654616:そのスコープからbar *を実行できますが、呼び出すときに引数として渡さない限り、そのスコープ内の変数を参照することはできません。私は例を挙げて更新します: – user113716