【问题标题】:Web browser is being "strict" for operations on undefined variables in JavascriptWeb 浏览器对 Javascript 中未定义变量的操作“严格”
【发布时间】:2012-07-21 23:59:12
【问题描述】:

如果变量foo 未定义,通常我可以这样做:

!foo;
foo === undefined;
foo !== 'some value';

但是,我现在正在处理的代码库中有一些东西似乎指示浏览器的解释器对除此之外的未定义变量的任何操作抛出异常:

typeof foo !="undefined";

我使用的浏览器与我通常使用的浏览器相同(Chrome 和 Firefox)。但这次我将在中间进行这个项目,而不是从头开始。这是一个使用 Backbone.js、下划线、车把、jQuery、yepnope 的 dJango 项目。

这种行为可能是由于指令"use strict" 出现在全局命名空间中的某处吗?我在项目中搜索了文本字符串“use strict”,并在一些似乎来自 twitter 的代码中找到了它:

文件:bootstrap.js 脚本.js 来自:http://twitter.github.com/bootstrap/javascript.html#transitions

我也在 json2 文件中找到了它。但是,我很确定上次使用该文件时没有给我带来问题:

文件:json2.js 来自:http://www.JSON.org/json2.js

据我所知,这甚至不是由在某处包含“use strict”引起的......

有什么想法吗?

非常感谢!

【问题讨论】:

  • NITPICK:typeof 是一个运算符,而不是一个方法调用。它不需要()
  • @epascarello - 已修复,谢谢!

标签: javascript twitter-bootstrap undefined-behavior use-strict


【解决方案1】:

当变量未声明时,您不能在比较中使用它。

undeclaredvar = 1;

是唯一有效的方法:undeclaredvar 在全局命名空间中隐式声明。

函数内部的严格模式声明永远不会“泄露”全局范围的严格性。因此,Twitter bootstrap / JSON2 中的"use strict"; 不会影响脚本的严格性。

【讨论】:

  • 更准确地说,您不能在比较中使用未声明的变量。具有未定义值的变量当然可以用于比较。
  • @josh3736 糟糕,漏掉了。不应该发生的。感谢提及。
【解决方案2】:

未定义未声明之间有一个重要的区别。

function test() {
    var foo;
    if (foo) { /* not executed */ }
}

这很好,因为声明了foo,但它的值是undefined

function test() {
    if (foo) { /* exception! */ }
}

这将引发异常 (ReferenceError),因为 foo声明。 (除非有window.foo。)

【讨论】:

  • 奇怪。为什么window.foo treatedfoo 不同?
  • @ChrisDutrow window.foowindow 对象的属性。另见:What is the difference between a global variables and attributes of the window object?
  • 我认为让我感到困惑的是所有全局变量都是窗口对象的属性。这不正确吗?
  • 在浏览器中,window 是全局范围。因此,如果您编写if (foo) ...,则会检查第一个本地范围(当前函数内的任何vars)是否有任何声明的foos。如果没有,则检查封闭函数(如果有)的范围以查找foo(也称为闭包)。最后,检查全局范围(window 对象)中的foo。如果没有foo,则抛出ReferenceError
  • @ChrisDutrow window.foo 是对window 对象的"foo" 属性 的读取操作。在正常情况下,始终可以读取属性,即使它们从未设置过。当您尝试读取 foo 变量(无前缀)的值时,会尝试查找foo 变量的声明。当变量既没有显式声明也没有隐式声明时,变量查找失败,并出现ReferenceError
猜你喜欢
  • 2015-12-23
  • 2020-10-26
  • 2011-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
相关资源
最近更新 更多