【问题标题】:Strict mode and reserved word严格模式和保留字
【发布时间】:2015-11-09 15:52:43
【问题描述】:

为什么这段代码没问题:

var test = {
    fn1: function(_origin, _componentType) {
        if(arguments.length > 1) throw "xx";
        // this strict is ok
        "use strict";

        var interface               = new Object(this);
    }
}

虽然不是

var test = {
    fn1: function(_origin, _componentType) {
        // This strict throws SyntaxError
        "use strict";

        if(arguments.length > 1) throw "xx";
        var interface               = new Object(this);
    }
}

我知道 interface 是严格模式下的保留字,但两个例子不应该抛出错误吗?

【问题讨论】:

    标签: javascript strict-mode


    【解决方案1】:

    "use strict"; 必须是函数(或脚本,如果是脚本范围)中的第一条语句才能触发严格模式;在其他任何地方,你也可以写"merry christmas";

    【讨论】:

    • +1 for "merry christmas";
    【解决方案2】:

    第一个示例实际上并未启用严格模式。见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Strict_mode#Invoking_strict_mode

    严格模式适用于整个脚本单个函数。它不适用于包含在 {} 大括号中的块语句;尝试将其应用于此类上下文无济于事。

    【讨论】:

    • 我确信这正如你所描述的那样有效,但它似乎是一个非常脆弱的约定,容易像 OP 那样混淆。有什么解释他们为什么这样做吗?
    • @chicks 抱歉,我不知道。它显然受到 Perl 的use strict 的启发,但它在任何地方都可以使用。也许这种方式更容易实现?
    • 然而,Perl 版本允许您在中间使用 no strictuse strict。太糟糕了,从 Perl 中窃取的人只窃取了一半的功能。 :)
    • @chicks:在 Perl 中,use strict 是一个声明。在 JavaScript 中,为了避免向后破坏,它只是一个字符串,被给予特殊处理。我在这里纯粹是猜测,但由于限制,解析器只需要检查第一条语句的特殊状态。它还确保程序员了解它会影响整个函数,而不仅仅是它之后的位;例如,function(x, x) { "use strict"; return x; } 确实会在 JS 中引发错误,即使错误位在技术上在它之前;在 Perl 中,$foo = "foo"; use strict; 不会抛出错误。
    猜你喜欢
    • 2018-03-27
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    • 2017-11-03
    • 2020-04-28
    • 1970-01-01
    相关资源
    最近更新 更多