javascript - 闭包中的 var functionName 与 functionName 赋值

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

最佳答案

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

关于javascript - 闭包中的 var functionName 与 functionName 赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28975328/

相关文章:

javascript - 如何 'onclick' 5秒后关闭javascript?

jQuery-UI 对话框内存泄漏

java - Groovy Closure 不检查所有者或委托(delegate)范围

javascript - 如何将 Jquery Chaining 应用于多父方法

javascript - 在 codepen 中,Intersection 观察者的行为与浏览器窗口不同

javascript - 在不重新刷新页面的情况下使用 ES6 时,事件监听器不会重新附加到我的 HTML 元素

r - 通过最小化 R 中的方差对数据进行分组

javascript - 如何返回分配给未命名函数的属性的名称

javascript - js 对象到 clojurescript 矢量/ map

javascript - "this"闭包函数内