【问题标题】:JSLint complains about redefining undefinedJSLint 抱怨重新定义 undefined
【发布时间】:2011-12-31 19:39:00
【问题描述】:

undefined 在技术上可以重新定义,因此它不是保留字。因此,我通常在匿名函数中编写代码,强制 undefined 成为未定义变量,如下所示:

(function (undefined) {
    "use strict";
    var o = {
        test: "testvalue"
    };
    if (o.test === undefined) {
        // Do stuff here
    } else {
        // Do other stuff there
    }
}());

但是,JSLint 提到了以下错误:

Problem at line 1 character 15: Expected an identifier and instead saw 'undefined' (a reserved word).

当代码可以任意重新定义变量时,为什么 JSLint 抱怨 undefined 是保留字?我知道你可以使用typeof x === "undefined";我只是想看看为什么这种方法行不通。

【问题讨论】:

  • “为什么 JSLint 抱怨 undefined 是保留字” 因为它是保留字!
  • @epascarello - 您能否提供一个列出保留字的 JavaScript/ECMAScript 参考的链接?我认为undefined 不在列表中,当然上面的代码也有效。您也可以只说undefined = "not undefined any more",它会起作用。
  • @nnnnnn @epascarello 根据Mozilla docsundefined 不是保留字。
  • 这段代码实际上并没有重新定义undefined,它只是将 undefined 作为参数传递给闭包。你可能想要var undefined='something else';

标签: javascript jslint reserved-words


【解决方案1】:
(function() { var undefined = 'foo'; console.log(undefined, typeof undefined); })();

根据 MDN,它实际上不是 JavaScript 中的保留字,可以重新定义。

【讨论】:

    【解决方案2】:

    'undefined' 在 2009 年 12 月发布的 ECMA-262 Edition 5 Section 15.1.1.3 中被声明为全局对象的不可变属性。

    通过在函数中使用“未定义”作为参数名称,您正试图用传递给函数的任何内容来改变它。所以从技术上讲,错误在于浏览器采用标准的速度很慢,而 JSLint 是正确的。

    【讨论】:

    • 根据那个文档: undefined 的值是 undefined (见 8.1)。该属性具有属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }。这个答案值得更多的投票!
    • 你没有改变任何东西,你在顶部添加了一个范围,它有一个名为 undefined 的单独变量(这也是未定义的)。
    • 是的,作为全局属性而不是关键字,您可以毫无问题地覆盖它。
    【解决方案3】:

    undefined 是保留字。这就像尝试将变量命名为 falsetrue。您传递给函数的值:

    function(undefined) {...}

    需要命名为其他名称,例如

    function(myVariable) {...}

    更新

    看起来它实际上可能没有保留为I originally read,但也许它只是 JSLint 认为应该保留的术语......

    【讨论】:

    • 能否提供 JavaScript 保留字的参考资料? undefined 未保留,问题中的代码有效(无论 JSLint 是否喜欢)。
    • 好吧,网上有很多“Javascript 保留字”页面,其中大部分都不相同,但我确实找到了这个:javascripter.net/faq/reserved.htm 有趣的是代码仍然有效。根据 JSLint,这可能只是一个“建议的”保留字。
    【解决方案4】:

    你的方法确实有效。仅仅因为 JSLint 不喜欢它并不能使它成为大罪。

    改用JSHint(为了更理智)。

    【讨论】:

    • JSHint 也抱怨同样的事情(至少从今天开始)
    猜你喜欢
    • 2011-05-11
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 2012-05-15
    • 2011-07-13
    • 2017-09-11
    相关资源
    最近更新 更多