【问题标题】:firebug console not doing hoisting萤火虫控制台不做吊装
【发布时间】:2012-07-27 18:23:12
【问题描述】:
console.log(a());
function a(){
    console.log("hello");
}

根据上面的代码,我希望"hello"(和一些undefineds)能够登录到控制台。但是萤火虫给了

ReferenceError: a is not defined

所以firebug不做吊装?

【问题讨论】:

  • 这些是从脚本还是从 Firebug 的控制台运行的?
  • 来自萤火虫控制台...@Josh,我希望 javascript 提升启动并且 a() 应该变得可见。如果您从 html 文件运行它,它将起作用。只有萤火虫不做吊装
  • 完全清楚:当您将代码粘贴到 Firebug 的控制台时会发生这种情况。
  • javascriptweblog.wordpress.com/2010/07/06/… - 另一位博主确认 Firebug 在某些情况下不会进行提升。在该页面上搜索“Firebug”。

标签: javascript firebug hoisting


【解决方案1】:

问题的原因是

函数在子块中声明时不会提升。

MDN (这里的很多内容不是标准的 ECMAScript)。

比较以下sn-ps:

alert(c());
function c(){return 42;}

{
    alert(c());
    function c(){return 42;}
}

第一个将警告 42,而第二个将抛出 ReferenceError

下面是在玩 Firebug 时执行的代码:

data;
with(_FirebugCommandLine){ // >> block begins
    console.log(a());
    function a(){
        console.log("hello");
    }
} // << block ends

更新
观察到的行为似乎是 Firefox javascript 引擎中的一个小故障,因为它在 chrome 和 IE9 中没有观察到,请参阅fiddle

【讨论】:

  • +1 用于查找原因。虽然很遗憾 atm MDN wiki 没有显示代码示例。它大多充满了reference to undefined name 'syntax' Exception of type 'MindTouch.Deki.Script.Runtime.DekiScriptUndefinedNameException' was thrown. 错误...
  • 你能解释一下这个小提琴jsfiddle.net/t3g4b发生了什么...如果函数没有提升,为什么输出8?
  • 我认为您的意思是链接到:developer-new.mozilla.org/en-US/docs/JavaScript/Reference/… .. 注意 url 中 mozilla.org 之前的 -new... 没有 -new 的 url 没有所有代码sn-ps。
  • 当然,正如已经提到的,是块触发了这种奇怪的行为。检查jsfiddle.net/FZ92S。此外,看起来 Chrome 和 Firefox 对它们的解释不同,因此 Chrome 为 8,Firefox 为 3。
  • 看来这不是故障——函数语句只是not valid in blocks at all(也称为whereswalden.com/2011/01/24/…)。解释器不会在非顶部块中找到函数语句后立即死亡,这是因为所有浏览器都扩展了 ECMAScript 规范,但以不同的方式进行。 (抄送:@AmithGeorge)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-10
  • 1970-01-01
  • 2014-03-12
  • 2013-09-07
  • 2011-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多