为什么这个功能有效?每次调用函数时 "executed" return 不应该为 false 吗?
Why does this function work? Shouldn't "executed" return to false every time the function is called?
这个函数应该只 运行 一次。但是我不明白为什么每次调用它时执行的变量都不会 return 为 false.
var onlyOnce = function() {
var executed = false;
return function() {
if (executed == false) {
executed = true;
console.log("Code reached");
}
};
}();
onlyOnce();
onlyOnce();
此代码只打印一次。为什么这样做有效?
使用自执行的外部函数,创建了一个闭包。结果,返回函数的每次执行都对 executed
的同一个实例进行操作。这会导致观察到的行为。
你应该仔细阅读闭包,e.g. on MDN。
这是因为您立即执行一个函数并将 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`
你最终得到的是 closure. 这意味着 executed
的值可以在生成的函数内部使用和更改。无论您将其设置为什么,下次调用它时它仍将具有该值(当然,除非有其他更改)。
这个函数应该只 运行 一次。但是我不明白为什么每次调用它时执行的变量都不会 return 为 false.
var onlyOnce = function() {
var executed = false;
return function() {
if (executed == false) {
executed = true;
console.log("Code reached");
}
};
}();
onlyOnce();
onlyOnce();
此代码只打印一次。为什么这样做有效?
使用自执行的外部函数,创建了一个闭包。结果,返回函数的每次执行都对 executed
的同一个实例进行操作。这会导致观察到的行为。
你应该仔细阅读闭包,e.g. on MDN。
这是因为您立即执行一个函数并将 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`
你最终得到的是 closure. 这意味着 executed
的值可以在生成的函数内部使用和更改。无论您将其设置为什么,下次调用它时它仍将具有该值(当然,除非有其他更改)。