【问题标题】:Whats going on with this JavaScript snippet?这个 JavaScript 片段是怎么回事?
【发布时间】:2013-11-10 04:47:29
【问题描述】:

来自http://dmitry.baranovskiy.com/post/91403200

if (!("a" in window)) {
    var a = 1;
}
alert(a);

这是我得到的结果:

  • Chrome 控制台 - [object 对象]
  • 萤火虫 - 未定义
  • Safari 控制台 - 未定义
  • Jsfiddle - 1

这是怎么回事??!我期望未定义,因为“if”应该返回一个假(因为窗口中的“a”应该是假的,并且!假应该是真的,因此变量a永远不会得到一个值)。我错过了什么?

编辑:好的,我意识到首先执行 var 语句,窗口中的“a”只返回这样的变量是否存在。但是为什么 Firebug 和 jsfiddle 给出不同的答案呢?

【问题讨论】:

  • 这里,if 并不重要,因为 var a 的范围仅在 if 块内。所有结果应为undefined。我刚刚在 ie、Chrome、ff、safari 和所有未定义的警报中进行了测试。
  • 您正在使用哪些 jsfiddle.net 选项?默认值为“onLoad”(查看侧边栏),它将您的 JavaScript 包装在一个函数中,该函数将更改 a 的范围。此外,严格地说 vars 先执行并不完全正确,var a 将被提升到范围的顶部,但 a = 1 部分留在原处。
  • 还是不明白为什么webkit浏览器上的[object Object]...
  • Chrome 控制台输出未定义。尝试在干净的选项卡上运行它。
  • @FabrícioMatté 你是对的!我在加载了该网站 (dmitry.baranovskiy.com) 的选项卡上运行它。清洁选项卡给出未定义。

标签: javascript


【解决方案1】:

这段代码被 javascript 解释器视为:

var a;
if (!("a" in window)) {
    a = 1;
}
alert(a);

根据a 是否已存在于全局范围内以及代码是在全局范围内还是在本地范围内运行,您有此代码的四种排列。

如果代码在本地函数范围内运行,那么它基本上看起来像这样:

function whatever() {
    var a;
    if (!("a" in window)) {
        a = 1;
    }
    alert(a);
}

所以,这里是排列:

global a exists already      scope code runs in       value of alert(a)
-----------------------------------------------------------------------
yes, has value of 2          global                   2
yes exists, value undefined  global                   undefined
no                           global                   1
yes, has value of 2          local                    undefined
yes exists, value undefined  local                    undefined
no                           local                    1

因此,您得到的答案的差异是因为此代码运行的范围在每种情况下都不同。

在 jsFiddle 中,你必须小心左上角的设置。如果设置为onload,则 jsFiddle 在本地函数范围内运行(onload 处理函数)。

这里发生的情况是,如果此代码在全局范围内运行,那么 ("a" in window) 将始终为真,因为代码的 var a 部分被提升到执行代码之上,因此全局范围内的 var a 始终被执行所以总是有("a" in window)。因此,a = 1 在全局范围内运行时永远不会执行,alert(a) 只是输出全局a 的值。如果它以前有一个定义的值,那就是你将看到的。如果它之前没有定义值,那么它只会提醒undefined,因为(认为它存在),它还没有被分配一个值。

如果此代码在本地范围内运行,则alert(a) 将始终在alert(a) 中看到本地定义的a。因此,如果没有全局a,您将看到1 作为值,因为a = 1 将在本地a 上执行。或者,如果存在全局a,则a = 1 将永远不会执行,因此本地定义的a 将始终为undefined,这就是警报将显示的内容。

【讨论】:

    猜你喜欢
    • 2011-08-25
    • 2013-07-28
    • 1970-01-01
    • 2011-06-28
    • 2020-04-03
    • 2018-06-20
    • 1970-01-01
    • 2022-07-18
    • 1970-01-01
    相关资源
    最近更新 更多