闭包中的var functionName vs functionName赋值

时间:2015-03-10 22:31:06

标签: javascript function closures variable-declaration

这个闭包代码可行:

function setupSomeGlobals(){
    var num = 666;
    gPrintNumber = function() { // play with var assignment 
        console.log(num)    
    }
    gIncreaseNumber = function() {
        num++;
    }
}

setupSomeGlobals();

gPrintNumber();
gIncreaseNumber();
gPrintNumber();

然而,当我将var关键字放在代码中的函数前面时,一切似乎都不起作用。这是为什么? var仅将这些变量设为本地吗?为什么会这么重要?

function setupSomeGlobals(){
    var num = 666;
    var gPrintNumber = function() { // play with var assignment 
        console.log(num)    
    }
    var gIncreaseNumber = function() {
        num++;
    }
}

setupSomeGlobals();

gPrintNumber();  // ReferenceError: gPrintNumber is not defined
gIncreaseNumber(); 
gPrintNumber();

1 个答案:

答案 0 :(得分:1)

  

var是否仅将这些变量设为本地?

完全。您无法从setupSomeGlobals函数外部访问局部变量。

未声明的变量,即没有var,变成全局变量,你应该避免这是非常糟糕的做法。如果要以干净和安全的方式封装某些函数,请尝试使用模块模式:

function setupSomeMethods() {
    var num = 666;
    return {
        gPrintNumber: function() {
            console.log(num)    
        },
        gIncreaseNumber: function() {
            num++;
        }
    };
}

var methods = setupSomeMethods();

methods.gPrintNumber();  // 666
methods.gIncreaseNumber(); 
methods.gPrintNumber();  // 667