假设此函数被完全独立调用两次。因此,为两个函数fn()
创建了超时回调,并且两个函数在其闭包中都有一个名为called
的变量。
这是相同的变量还是两个完全独立的变量?为什么?
function createFunctionWithTimeout(callback, opt_timeout) {
var called = false;
function fn() {
if (!called) {
called = true;
callback();
}
}
setTimeout(fn, opt_timeout || 5000);
return fn;
}
答案 0 :(得分:2)
函数关闭用var
声明的变量。您的场景中的called
将是两个完全独立的变量,因为当函数createFunctionWithTimeout
被调用两次时,每次调用都会“创建”一个新变量。
如果调用返回的函数(fn
),它将可以访问called
变量,因为它也会关闭它(嵌套函数)。在这种情况下,called
不是独立的。它属于通过调用createFunctionWithTimetout
答案 1 :(得分:0)
将在每次调用时创建在createFunctionWithTimeout中声明的所有内容。
这个被称为功能范围的设计就像这样。
阅读本文,并查看JS中的范围。
http://www.w3schools.com/js/js_scope.asp
顺便说一句。要使变量called
对于每个调用都相同,您需要将其设置为全局变量。就像把它放在功能之外。在这种情况下,他们将使用相同的变量。
希望这有帮助。
答案 2 :(得分:0)
每次调用新函数时,它都会创建自己的独立范围,此范围内的对象仅与此特定范围相关,换句话说,您的被调用变量是两个完全独立的变量。