我使用JavaScript在Chrome v57.0.2987.133中获得了一些非常奇怪的行为:
这是我的代码:
var firstName = "Bob";
var lastName = "Smith";
var age = 29;
function happyBirthdayLocal(first, last, a) {
a = a + 1;
message = "Happy Birthday to " + first + " " +
last + " who just turned " + a;
console.log(message);
}
happyBirthdayLocal(firstName, lastName, age);
正如预期的那样,因为我没有在函数var
前面使用message
,message
就像一个全局变量,我可以访问window.message
开发者控制台
但是,如果我在函数调用之上插入访问message
的行,如下所示:
var firstName = "Bob";
var lastName = "Smith";
var age = 29;
function happyBirthdayLocal(first, last, a) {
a = a + 1;
message = "Happy Birthday to " + first + " " +
last + " who just turned " + a;
console.log(message);
}
console.log(message);
happyBirthdayLocal(firstName, lastName, age);
(没有其他更改!)现在,我收到了未被捕获的引用错误,并且window.message
已不再定义。
我的感觉是"未能声明变量很可能会导致意外结果"在这里发挥作用,似乎Chrome处于中间位置,根据程序中的其他用途,默认为未声明变量的全局与本地范围?谁能证实这一点?
我在Firefox中获得了类似的结果。我尝试过搜索有关Firefox和Chrome中未声明变量的默认行为的具体信息,除了可能会发现奇怪的行为之外,没有找到更具启发性的信息。
(我有点惊讶的是,实际上并没有打破一堆人的代码。或许它有。我在这里错误地使用了变量 - 没有声明 - 是在关于全局范围和局部范围的教学背景下;我不会故意忘记声明一个变量(并且无论如何都会丢失我的代码),所以这是我第一次注意到这种行为。)
提前感谢您的任何见解。
答案 0 :(得分:4)
按顺序逐步完成。
首先,由于提升,声明了变量firstName
,lastName
,age
,并且还声明了函数happyBirthdayLocal
。
然后,firstName
,lastName
,age
都会分配其值。
接下来,您致电console.log(message);
。呃 - 哦,message
还没有被定义。在第一次实际调用happyBirthdayLocal
之前,这种情况不会发生,这将在下一行。
由于该错误是致命的,因此永远不会调用该函数,并且message
仍未定义。