问题标签 [hoisting]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
9 回答
4780 浏览

javascript - Which design pattern(s) take advantage of JavaScript's hoisting behavior?

Ben Cherry's excellent article explains hoisting in JavaScript adequately. My problem, however, is that I cannot conceive a use case for this notorious perpetrator of confusion. Please explain if there is a design pattern that actually takes advantage of this language feature.

Secondly, is scope hoisting unique to JavaScript?

UPDATE --- I'm adding a bounty for an answer that satisfies my curiosity: Which design pattern(s) actually take advantage of JavaScript's hoisting behavior? I understand why JavaScript supports hoisting, but I want to know how I can take advantage of this feature.

0 投票
3 回答
235 浏览

javascript - Javascript:z = z || [] 在不使用 VAR 时抛出错误 - 为什么?

出于求知欲,为什么 javascript 接受

初始化 z(如 z 最初定义的那样)

但没有 var,它会引发错误(在全局空间中)

(如果 z 以前未定义)

在全局空间中,您不需要使用 VAR,尽管我知道这可能是不好的做法。

在你说这是重复的问题之前

var 关键字的用途是什么以及何时使用它(或省略它)?

请注意“如果您在全局范围内,则没有区别”的声明。

鉴于我的工作示例,显然这不是 100% 正确的。

这是一个怪癖还是有合理的逻辑?


添加我所学的答案摘要:

感谢 Tim(见下文),我误解的关键是没有意识到这一点(javascript 基础)

变量 z; 如果 z 已经存在,则什么都不做

如果您错误地假设“var z”总是初始化,这就是这个表达式似乎有两种方式的方式。

从左边开始,“var z”只是确保 z 已定义,但实际上不会影响任何现有值(如果它已经存在)。然后在右边,如果 z 已经存在,则使用它,如果不存在,则该变量刚刚声明(但为空),因此不会使用但不会抛出错误。

这是一篇关于 Javascript 中这种范围界定和提升问题的优秀文章:http: //www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting

非常感谢 minitech 和其他所有做出贡献的人!

0 投票
3 回答
208 浏览

javascript - 编写函数的不同方式会在 JavaScript 中带来不良影响?


更新:

问题解决了!我意识到这是由于“吊装”造成的。基本上,JavaScript 解释器解析代码并在函数的开头声明所有变量(但不初始化它们)。这就是为什么第二个示例不起作用的原因。因为 JavaScript 解释器var changed;在函数的开头声明,但直到到达代码主体时才对其进行初始化。

对于像第一个示例这样的函数声明,JavaScript 不是像第二个示例那样仅向上移动变量名,而是在父函数的开头向上移动(或“提升”)整个函数,这就是它起作用的原因!

无论如何,我写这个供个人参考,谢谢你的答案......


这个有效:http: //jsbin.com/emarat/7/edit

但这个没有:http: //jsbin.com/emarat/9/edit

为什么?

0 投票
4 回答
25257 浏览

javascript - 确保首先运行 Javascript 脚本?

我注意到某些脚本似乎在某个页面上的其他脚本之前被调用,我想知道,脚本加载的具体顺序是什么?引用 .js 脚本之前的页面内?它们是按页面中从第一个<script>提到到最后一个的顺序运行的,还是依赖于浏览器?如何确保特定脚本首先在页面中运行?

0 投票
5 回答
167 浏览

javascript - 对吊装感到困惑

考虑这两个稍微不同的提升版本......

这将输出“fingal”,然后是“fingal”

这将输出“未定义”和“fingal”

为什么?

0 投票
2 回答
255 浏览

javascript - JavaScript minifiers 是否应该自动组合 var 声明?

我刚刚发现 YUICompressor (2.4.7) 没有结合 var 声明。例如,

压缩到

认为期望 minifier 能够组合连续的var 声明是合理的,如下所示:

但我真正的问题是期望/可能(对于缩小器)在单个函数中自动安全地组合非连续 var 声明是否合理?

0 投票
1 回答
144 浏览

javascript - 萤火虫控制台不做吊装

从上面的代码中,我希望"hello"(和一些undefined)能够登录控制台。但萤火虫给

所以firebug不做吊装?

0 投票
1 回答
95 浏览

javascript - 避免因吊装造成的滞后

我想记录“点击”并尽快执行 HUD,但 oauth_upload_photo 导致它滞后(显然是因为提升)。如何立即捕捉 HUD?

0 投票
3 回答
1226 浏览

javascript - Javascript中的名称解析?

我正在阅读这篇文章,我有一些问题请教:

考虑到这段代码:

这会提醒 1. (我的问题是为什么?)

文章说明了它与名称解析有关。

名称解析(根据文章)由以下顺序确定:

第 3 行假设更改全局 a 的值。但是函数 a(){...} 优先于声明内部(如果我理解正确的话),这就是为什么警报 1

ps如果我删除第5行,它会提醒10。

一般来说,如果一个名字已经被定义,它永远不会被另一个同名的实体重新定义。即函数声明优先于同名变量的声明。但这并不意味着变量赋值不会替换函数,只是它的定义会被忽略。

我不明白那部分:

但这并不意味着变量赋值的值不会替换函数

所以有两个问题:

  • 我是否正确理解了提醒的原因1

  • 上面的线是什么意思?(被误解的部分)

谢谢。

0 投票
2 回答
349 浏览

javascript - 我到底如何从函数中更改全局变量?

我花了 3 天时间试图解决这个简单的问题。我想要的只是让我的整个网站记住winversion全局变量值并能够从函数中更改它。(是的,我知道全局变量比 darthwader 更邪恶,但请这是我生命中唯一的好事)

我有一个带有 .html 的 html 文件<iframe>,当用户在里面点击时,我将不同的页面(来自我的域)加载到该<iframe>.

这是我的 index.html (它周围有几个 div,<iframe>但我很确定这无关紧要,因为其他一切都有效,而 javascript 仅适用于此<iframe>

默认的 iFrame 页面有这个 html 代码

我的 script.js 是这个

但后来,<iframe>当我尝试winversion在同一个 JavaScript 文件中读取时,它显示未定义。navigatenow()当用户在第 1 页选择 windows 版本并在下一个 html 页面中单击链接以启动 msconfig 描述页面(加载在 中)时触发此功能<iframe>

我努力了:

  • 使用 / 不使用var.

  • 使用/不使用单引号,双引号(尽管我知道这没什么区别)。

  • 阅读了十几篇关于吊装的文章。

  • 使用 persistjs 几个小时。

  • 冥想和祈祷!

没有任何效果。该死的winversion变量仍然像我存在的目的一样未定义。

我想要的只是让我的 html 文件记住用户选择的 windows 版本(不,我无法以编程方式检测 windows 版本,我询问用户版本的目的是不同的)。

任何帮助将不胜感激解决此问题,如果没有,请建议一个合适的悬崖,我可以从中跳下。