闭包中的 var functionName 与 functionName 赋值

var functionName vs functionName assignment in a closure

这个关闭代码可以工作:

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();

Is var making these variable local only?

没错。您无法从 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