严格模式和保留字

5
为什么这段代码是正确的:
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是保留字,但是这两个例子不应该都会抛出错误吗?

2个回答

10

"use strict";需要作为函数(或脚本全局)中的第一条语句触发严格模式。在其他任何位置,你写的就好像是"merry christmas";


6
对于 "+1" 和 "merry christmas" 的组合,通常表示对前者的赞同或认可,同时也祝愿对方圣诞快乐。 - iam-decoder

4

我相信这个方法按照你所描述的是可行的,但它似乎是一种非常脆弱的约定,容易引起像 OP 这样的混淆。他们为什么要这样做有任何解释吗? - chicks
@chicks 抱歉,我不知道。显然这是受到 Perl 的 use strict 启发,但它在任何地方都能起作用。也许这样实现更容易一些? - melpomene
然而,Perl版本允许您在程序运行过程中使用no strictuse strict。很遗憾,从Perl窃取的人只偷了功能的一半。 :) - chicks
2
@chicks:在Perl中,use strict是一个语句。在JavaScript中,为了避免向后不兼容,它只是一个字符串,被赋予特殊的处理方式。我只是猜测,但是有了这个限制,解析器只需要检查第一个语句是否具有特殊状态。它还确保程序员理解它影响整个函数,而不仅仅是它之后的部分;例如,在JS中,function(x, x) { "use strict"; return x; }会抛出错误,即使错误的部分在严格模式声明之前;在Perl中,$foo = "foo"; use strict;不会抛出错误。 - Amadan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接