2016-07-12 29 views
0

この関数は一度だけ実行されるはずです。しかし、私はなぜ呼び出されるたびに、実行される変数がfalseに戻らないのか理解していません。この機能はなぜ機能しますか?関数が呼び出されるたびに、 "実行"しないとfalseに戻りますか?

var onlyOnce = function() { 
 
    var executed = false; 
 
    return function() { 
 
    if (executed == false) { 
 
     executed = true; 
 
     console.log("Code reached"); 
 
    } 
 
    }; 
 
}(); 
 
onlyOnce(); 
 
onlyOnce();

回だけこのコード印刷。なぜこれは機能しますか?

+0

javascriptでは、変数には括弧内のスコープがあります。ある意味では、 "実行された"とは、返された関数に対してグローバルであると考えて、変更したときにその値を保持します。それは変だけど、ちょっと、これはjavascript – Makketronix

+0

クロージャについて読む... http://stackoverflow.com/questions/111102/how-do-javascript-closures-work –

答えて

2

これは、すぐに関数を実行し、その結果にonlyOnceを設定しているためです。

function createOnlyOnce() { 
    var executed = false; 
    return function() { // Return a new function 
    if (!executed) { // I prefer this over == false 
     executed = true; 
     console.log('Code reached'); 
    } 
    }; 
} 

var onlyOnce = createOnlyOnce(); // Created a new function 
onlyOnce(); // Calls the generated function, not createOnlyOnce 
onlyOnce(); // Since we're calling the generated function, executed is still `true` 

何がで終わること。これは、executedの値が生成された関数の内部で使用して変更することができることを意味closure.です:あなたはこのようにそれを書き換えることができます。何に設定しても、次回呼び出すときにはその価値があります(他の何かが変更されない限り)。

0

自己実行外部関数では、クロージャが作成されます。結果として、返された関数の実行はすべてexecutedの同じインスタンスで処理されます。これは観察された挙動をもたらす。

閉鎖については、e.g. on MDNをお読みください。

関連する問題