问题标签 [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.
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.
javascript - Javascript:z = z || [] 在不使用 VAR 时抛出错误 - 为什么?
出于求知欲,为什么 javascript 接受
初始化 z(如 z 最初定义的那样)
但没有 var,它会引发错误(在全局空间中)
(如果 z 以前未定义)
在全局空间中,您不需要使用 VAR,尽管我知道这可能是不好的做法。
在你说这是重复的问题之前
请注意“如果您在全局范围内,则没有区别”的声明。
鉴于我的工作示例,显然这不是 100% 正确的。
这是一个怪癖还是有合理的逻辑?
添加我所学的答案摘要:
感谢 Tim(见下文),我误解的关键是没有意识到这一点(javascript 基础)
变量 z; 如果 z 已经存在,则什么都不做
如果您错误地假设“var z”总是初始化,这就是这个表达式似乎有两种方式的方式。
从左边开始,“var z”只是确保 z 已定义,但实际上不会影响任何现有值(如果它已经存在)。然后在右边,如果 z 已经存在,则使用它,如果不存在,则该变量刚刚声明(但为空),因此不会使用但不会抛出错误。
这是一篇关于 Javascript 中这种范围界定和提升问题的优秀文章:http: //www.adequatelygood.com/2010/2/JavaScript-Scoping-and-Hoisting
非常感谢 minitech 和其他所有做出贡献的人!
javascript - 编写函数的不同方式会在 JavaScript 中带来不良影响?
更新:
问题解决了!我意识到这是由于“吊装”造成的。基本上,JavaScript 解释器解析代码并在函数的开头声明所有变量(但不初始化它们)。这就是为什么第二个示例不起作用的原因。因为 JavaScript 解释器var changed;
在函数的开头声明,但直到到达代码主体时才对其进行初始化。
对于像第一个示例这样的函数声明,JavaScript 不是像第二个示例那样仅向上移动变量名,而是在父函数的开头向上移动(或“提升”)整个函数,这就是它起作用的原因!
无论如何,我写这个供个人参考,谢谢你的答案......
这个有效:http: //jsbin.com/emarat/7/edit
但这个没有:http: //jsbin.com/emarat/9/edit
为什么?
javascript - 确保首先运行 Javascript 脚本?
我注意到某些脚本似乎在某个页面上的其他脚本之前被调用,我想知道,脚本加载的具体顺序是什么?引用 .js 脚本之前的页面内?它们是按页面中从第一个<script>
提到到最后一个的顺序运行的,还是依赖于浏览器?如何确保特定脚本首先在页面中运行?
javascript - 对吊装感到困惑
考虑这两个稍微不同的提升版本......
这将输出“fingal”,然后是“fingal”
这将输出“未定义”和“fingal”
为什么?
javascript - JavaScript minifiers 是否应该自动组合 var 声明?
我刚刚发现 YUICompressor (2.4.7) 没有结合 var 声明。例如,
压缩到
我认为期望 minifier 能够组合连续的var 声明是合理的,如下所示:
但我真正的问题是期望/可能(对于缩小器)在单个函数中自动安全地组合非连续 var 声明是否合理?
javascript - 萤火虫控制台不做吊装
从上面的代码中,我希望"hello"
(和一些undefined
)能够登录控制台。但萤火虫给
所以firebug不做吊装?
javascript - 避免因吊装造成的滞后
我想记录“点击”并尽快执行 HUD,但 oauth_upload_photo 导致它滞后(显然是因为提升)。如何立即捕捉 HUD?
javascript - Javascript中的名称解析?
我正在阅读这篇文章,我有一些问题请教:
考虑到这段代码:
这会提醒 1. (我的问题是为什么?)
文章说明了它与名称解析有关。
名称解析(根据文章)由以下顺序确定:
第 3 行假设更改全局 a 的值。但是函数 a(){...} 优先于声明内部(如果我理解正确的话),这就是为什么警报 1
ps如果我删除第5行,它会提醒10。
一般来说,如果一个名字已经被定义,它永远不会被另一个同名的实体重新定义。即函数声明优先于同名变量的声明。但这并不意味着变量赋值不会替换函数,只是它的定义会被忽略。
我不明白那部分:
但这并不意味着变量赋值的值不会替换函数
所以有两个问题:
我是否正确理解了提醒的原因1
上面的线是什么意思?(被误解的部分)
谢谢。
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 版本,我询问用户版本的目的是不同的)。
任何帮助将不胜感激解决此问题,如果没有,请建议一个合适的悬崖,我可以从中跳下。