Javascript 闭包中的var functionName与functionName赋值
此关闭代码将起作用:Javascript 闭包中的var functionName与functionName赋值,javascript,function,closures,variable-declaration,Javascript,Function,Closures,Variable Declaration,此关闭代码将起作用: function setupSomeGlobals(){ var num = 666; gPrintNumber = function() { // play with var assignment console.log(num) } gIncreaseNumber = function() { num++; } } setupSomeGlobals(); gPrintNumber();
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();
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
缺少
var
是一个错误,它会使变量隐式全局变量。这样的错误不是好的做法吗?你所说的“隐式全局变量”是什么意思?“var是否仅使这些变量成为局部变量?”是的,这正是它所做的相关(重复?):