javascript - 为什么返回后的变量提升在某些浏览器上有效,而在某些浏览器上无效?

标签 javascript hoisting

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/

相关文章:

javascript - javascript 中的词法作用域和提升

Javascript 提升自执行功能

javascript - 在 node.js 中链接 underscore.js 抛出 'Invalid REPL keyword'

javascript - 如何在 Chrome 中禁用弹出窗口的位置栏和滚动条?

javascript - 第一次尝试启动解析服务器项目时找不到模块 'http2'

dom - 将 html 插入 yahoo 的 YUI 富文本编辑器

javascript - 为什么 catch 子句有自己的词法环境?

JavaScript 变量提升

javascript - 无法读取云功能中的托管文件

javascript - iOS TextInput 高度相对于字体大小 react-native