我经常会遇到根据自己的心情行事的情况:
情况A):
function a() {
var msg = 'a()';
..operate on msg
}
function b() {
var msg = 'b()';
..operate on msg
}
情况B):
var msg;
function a() {
msg = 'a()';
..operate on msg
}
function b() {
msg = 'b()';
..operate on msg
}
请注意, “操作msg” 我不是指一个功能,而是一堆操作。
我很感兴趣,因为 JSHint 指出已经预定义的变量,尽管它们具有相同的名称,但出现在不同的函数中。例如。
更新 在提出这个问题时我可能是不正确的,以便清除我已经改变了功能的情况。
更新2 我理解范围。我的意思是,除了范围之外,还有其他优势吗?
答案 0 :(得分:1)
正如其他人所建议的那样,您必须阅读有关Javascript中变量提升的更多信息。 我会尝试演示它。
function test() {
var t1 = msg + " hello";
console.log(t1); // prints "undefined hello" because msg is undefined
var t2 = msgx + " hello"; // msgx ReferenceError
var a = 1;
var b = 2;
if (a > b) {
var msg = 'sample';
}
}
test();
在示例中,您可以看到msg
已声明。但它未定义。另一方面,msgx
导致引用错误。它没有在任何地方声明。所以关键是语句var msg = 'sample';
后来在if
括号内的函数中,使msg
成为函数中无处不在的有效变量。因此,再次声明msg
将为您提供预定义的变量警告。
在javascript中,只有一个函数可以创建一个范围。即使有其他控制语句的内括号,函数中声明的所有内容都将在整个函数范围内可用。在函数内的不同行中声明的所有变量都将被提升并处理,就像在函数的起始行中声明一样。
答案 1 :(得分:0)
这几乎没有区别......在每种情况下都定义了变量,但是如果你不使用msg变量,第一种情况就是保存一点数据:)但这太简单了。
答案 2 :(得分:0)
你了解范围吗?
在情况B中,您的变量仅在函数范围内可用。
function(){
var foo = 10;
}
console.log(foo); //undefined
在情况A中,您的变量可在全球范围内使用。
var foo;
function(){
foo = 10;
}
console.log(foo); //10
在情境A中,从函数中修改foo会在任何地方修改它。在情况B中,仅修改局部变量。