[英]Strange behavior with var in Chrome
我在使用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);
不出所料,因为我没有在函数中的message
前面使用var
,所以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中未声明变量的默认行为是什么的特定信息,除了发现潜在的奇怪行为之外,没有发现任何其他启发性的内容。
(我有点惊讶这实际上并没有破坏很多人的代码。或者也许已经破坏了。我在这里对变量的(误用)用法(未声明)是在教授全局vs.局部作用域;我不会故意忘记声明一个变量(而且无论如何都会使我的代码掉毛),所以这是我第一次注意到这种行为。)
预先感谢您的任何见解。
按顺序进行操作。
首先,由于提升,声明了变量firstName
, lastName
, age
,并且还声明了函数happyBirthdayLocal
。
然后, firstName
, lastName
, age
都被分配了它们的值。
接下来,您调用console.log(message);
。 哦, message
尚未定义。 在第一次真正调用happyBirthdayLocal
之前,不会发生这种情况。
由于该错误是致命的,因此永远不会调用该函数,并且message
仍未定义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.