闭包中变量的值是否在两个闭包中被调用两次相同?

时间:2016-08-25 14:22:50

标签: javascript

假设此函数被完全独立调用两次。因此,为两个函数fn()创建了超时回调,并且两个函数在其闭包中都有一个名为called的变量。

这是相同的变量还是两个完全独立的变量?为什么?

function createFunctionWithTimeout(callback, opt_timeout) {
    var called = false;
    function fn() {
        if (!called) {
            called = true;
            callback();
        }
    }
    setTimeout(fn, opt_timeout || 5000);
    return fn;
}

3 个答案:

答案 0 :(得分:2)

函数关闭用var声明的变量。您的场景中的called将是两个完全独立的变量,因为当函数createFunctionWithTimeout被调用两次时,每次调用都会“创建”一个新变量。

如果调用返回的函数(fn),它将可以访问called变量,因为它也会关闭它(嵌套函数)。在这种情况下,called不是独立的。它属于通过调用createFunctionWithTimetout

创建的闭包

答案 1 :(得分:0)

将在每次调用时创建在createFunctionWithTimeout中声明的所有内容。

这个被称为功能范围的设计就像这样。

阅读本文,并查看JS中的范围。

http://www.w3schools.com/js/js_scope.asp

顺便说一句。要使变量called对于每个调用都相同,您需要将其设置为全局变量。就像把它放在功能之外。在这种情况下,他们将使用相同的变量。

希望这有帮助。

答案 2 :(得分:0)

每次调用新函数时,它都会创建自己的独立范围,此范围内的对象仅与此特定范围相关,换句话说,您的被调用变量是两个完全独立的变量。