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

2023-12-21

alert(myVar1);
return false;
var myVar1;

上面的代码在 IE、FF 和 Opera 中抛出错误,指出 return 语句必须出现在函数中。但它有效(显示undefined)在 Safari 和 Chrome 中。

上面的代码是在全局范围内编写的。所有功能之外。

任何原因?


在 JavaScript 中,变量被移动到脚本的顶部然后运行。所以当你运行时它会做

var myVar1;
alert(myVar1);
return false;

这是因为 JavaScript 并没有真正意义上的词法作用域。这就是为什么将所有变量声明在它们将用于防止提升导致问题的区域的顶部被认为是最佳实践的原因。 JSLint 会对此抱怨。

这是一篇很好的文章,解释了这一点:http://www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting 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 中的差异而发出的。追踪猴子(http://ejohn.org/blog/tracemonkey/ http://ejohn.org/blog/tracemonkey/)我相信会采用 JavaScript 并进行快速静态分析,然后执行 JIT,然后尝试运行它。如果失败了,那么显然没有任何作用。

V8 不进行静态分析并转移到 JIT 然后运行这样的东西。它更类似于Python。如果您在 Chrome 的开发者控制台(Windows 中为 ctrl+shift+j)中运行该脚本,它会抛出错误,但也会运行并向您发出警报。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • SourceTree 中的壁球

    是否可以在 SourceTree 中进行压缩 我看到显然你可以 拖放 提交来压缩它们 然而 当我这样做时 它只会突出显示几个提交 更新答案 Windows 源树 从 1 5 版本开始 http blog sourcetreeapp com
  • 使用枢轴重新排序多索引数据框

    我有一个数据框 df1 如下所示 df1 pd DataFrame ID 1 2 3 4 5 6 date 1 1 1 2 2 2 p id 1 2 3 1 2 3 9h30 0 11 0 12 0 13 0 14 0 15 0 16 9h
  • PHP 致命错误:找不到类“CTestCase”

    只是尝试在我的本地机器上运行一个简单的测试 但出现以下错误 PHP Fatal error Class CTestCase not found in 跑步时 phpunit UserTest 我想我的配置一定缺少什么 我就是不明白是什么 U
  • 在屏幕中间对齐 Foundation 5 选项卡

    我正在尝试对齐 Foundation 5 附带的开箱即用选项卡 出于某种原因 默认情况下它们是向左对齐的 我不知道如何让它们与屏幕中心对齐 我正在使用的代码相当简单 沼泽标准选项卡标记 Example ul class tabs li cl
  • 清除元素前后的浮动

    我有一系列的元素float left 彼此身上 理想情况下 我想用一个类清除单个元素两侧的浮动 而不添加另一个类clear left 在非浮动元素之后 示例 其中 one line应该在自己的线路上 http jsbin com koniv
  • 从 R 函数返回绘图

    为什么我的 R 函数不返回或打印绘图 代码如下 除了情节之外 所有代码似乎都运行良好 无论我做什么 我都无法让 R 在调用函数时创建绘图 在网上查了一下 我找不到任何不起作用的原因 powerc fun lt function n sigm
  • 为什么递归优于迭代?

    迭代比递归性能更高 对吧 那么为什么有些人认为递归比迭代更好 用他们的话说更优雅 我真的不明白为什么像Haskell这样的语言不允许迭代并鼓励递归 鼓励性能不佳的东西 当有更高性能的选项 即递归可用时也是如此 这不是很荒谬吗 请阐明这一点
  • 我们如何在 localStorage 中存储字符串?

    我正在学习 javascript xml 和 html 对于家庭作业 我需要从 XML 文件的某些节点检索一些数据 连接数据 并将连接的字符串存储在 localStorage 中 我在将连接的字符串存储在 localStorage 中时遇到
  • java异常会终止整个java应用程序吗?

    我曾经认为当异常发生时 整个java应用程序都会被终止 例如 我编写一个测试函数来测试我的想法 public void test File fileDir new File sourceDataDir if fileDir exists F
  • 为什么从 x86_64 汇编函数调用 C abort() 函数会导致分段错误 (SIGSEGV) 而不是中止信号?

    考虑该程序 main c include
  • setAngle 不是 Fabricjs 的函数

    我最近开始使用fabricjs 我有一个关于连接对象的问题 我正在创建用于连接的示例演示parent object to child object用箭头连接 我得到了示例演示http kpomservices com HTML5Canvas
  • 将对角线转置为 Google 电子表格中的行?

    我试图找到一个可以返回数组对角线的公式A1 D4如下 A1 B2 C3 D4 我找到了这个 它返回一列 但我不知道如何对一行中的值进行排序 INDEX A1 D1 ROWS 1 1 粘贴到下面的列中 A TRANSPOSE对结果当然可以解决
  • 如何停止执行器中的循环运行?

    我正在运行需要时间才能完成的功能 用户可以选择停止此功能 事件 有没有一种简单的方法来停止线程或循环 class ThreadsGenerator MAX WORKERS 5 def init self self executor Thre
  • KeyBoardWIllShowNotification 调用一次的原因是什么?

    我在用keyboardWasShown and keyboardWillBeHidden滑动视图以获得可见文本视图的通知 我有一个UITabBar具有六个选项卡的应用程序 在每个视图中我都使用UINavigationController 在
  • PyCharm Windows:如何修改命令行的shell PATH?

    In the Settings gt Tools gt Terminal菜单 您可以阅读here https www jetbrains com help pycharm settings tools terminal html您可以更改
  • 设置 std::map 中的所有值

    如何设置a中的所有值std map到相同的值 而不使用循环迭代每个值 Using a loop is by far the simplest method In fact it s a one liner C 17 for auto v m
  • 另一个 ASP:Textbox 与

    我读过一些关于这个主题的文章 但我对此仍然持谨慎态度 我一直在使用 ASP Textbox 但我想知道输入文本框在不使用 ASP Textbox 的情况下无法执行哪些操作 或者需要更多的努力才能完成 我有一个使用 HTML 输入文本框的 J
  • 如何为 Powershell 函数添加别名?

    目的是调用该函数hello通过致电hello或别名helloworld Code function hello param string name Write Host Hello name hello Utrecht helloworld
  • 使用 PreventDefault 提交 Ajax 表单

    我有一个普通的 HTML 表单 其中应该阻止默认表单提交并通过 Ajax 发布值 它不适用于我的设置请帮助我哪里出错了 将我视为 Jquery javascrip 新手
  • 为什么返回后的变量提升在某些浏览器上有效,而在某些浏览器上无效?

    alert myVar1 return false var myVar1 上面的代码在 IE FF 和 Opera 中抛出错误 指出 return 语句必须出现在函数中 但它有效 显示undefined 在 Safari 和 Chrome