Chrome中使用var的奇怪行为

时间:2017-04-06 17:39:55

标签: javascript google-chrome var

我使用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前面使用messagemessage就像一个全局变量,我可以访问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中未声明变量的默认行为的具体信息,除了可能会发现奇怪的行为之外,没有找到更具启发性的信息。

(我有点惊讶的是,实际上并没有打破一堆人的代码。或许它有。我在这里错误地使用了变量 - 没有声明 - 是在关于全局范围和局部范围的教学背景下;我不会故意忘记声明一个变量(并且无论如何都会丢失我的代码),所以这是我第一次注意到这种行为。)

提前感谢您的任何见解。

1 个答案:

答案 0 :(得分:4)

按顺序逐步完成。

首先,由于提升,声明了变量firstNamelastNameage,并且还声明了函数happyBirthdayLocal

然后,firstNamelastNameage都会分配其值。

接下来,您致电console.log(message);。呃 - 哦,message还没有被定义。在第一次实际调用happyBirthdayLocal之前,这种情况不会发生,这将在下一行。

由于该错误是致命的,因此永远不会调用该函数,并且message仍未定义。