闭包中的 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
这个关闭代码可以工作:
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