alert(myVar1);
return false;
var myVar1;
以上代码在 IE、FF 和 Opera 中抛出错误,指出函数中必须有 return 语句。但它在 Safari 和 Chrome 中有效(显示 undefined
)。
以上代码是在全局范围内编写的。在所有功能之外。
有什么原因吗?
最佳答案
在 JavaScript 中变量被移动到脚本的顶部然后运行。所以当你运行时它会做
var myVar1;
alert(myVar1);
return false;
这是因为 JavaScript 并没有真正意义上的词法作用域。这就是为什么将所有变量声明在区域顶部被认为是最佳实践的原因,它们将用于防止提升导致问题。 JSLint 会提示这个。
这是一篇解释它的好文章:http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting
返回无效。如果你想做一个真正的提升示例(取自上面的链接)做
var foo = 1;
function bar() {
if (!foo) {
var foo = 10;
}
alert(foo);
}
bar();
这将提醒 10
以下是我的理解,我曾在某处阅读过,但无法找到我阅读过的所有来源,因此欢迎更正。
这要归功于 JavaScript JIT 的不同 Alerts。 TraceMonkey( http://ejohn.org/blog/tracemonkey/ ) 我相信会采用 JavaScript 并进行快速静态分析,然后执行 JIT,然后尝试运行它。如果失败,则显然没有任何效果。
V8 不做静态分析,而是转移到 JIT 然后运行这样的东西。它更类似于 Python。如果您在 Chrome 的开发人员控制台(Windows 中为 ctrl+shift+j)中运行该脚本,它会抛出错误,但也会运行以向您发出警报。
关于javascript - 为什么返回后的变量提升在某些浏览器上有效,而在某些浏览器上无效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3725546/