严格模式如何(“使用严格;)由函数继承

How is strict mode ("use strict";) inherited by functions?

本文关键字:函数 继承 使用严格 模式      更新时间:2023-09-26

这是我的代码,似乎表明答案是肯定的 - http://jsfiddle.net/4nKqu/

var Foo = function() {
    'use strict'
    return {
        foo: function() {
            a = 10
            alert('a = ' + a)
        }
    }
}()
try {
    Foo.foo()
} catch (e) {
    alert(e)
}

您能否引用标准中的语句,阐明'use strict'会自动应用于我们'use strict'应用函数中定义的所有闭包和函数?

规范的相关部分:

http://www.ecma-international.org/ecma-262/5.1/#sec-10.1.1

其中说:

Code is interpreted as strict mode code in the following situations:
    如果全局代码
  • 以包含使用严格指令的指令序言开头,则全局代码是严格的全局代码(参见 14.1(。

  • 如果 eval 代码以包含使用严格指令的指令序言开头,或者如果调用 eval 是对 eval 函数的直接调用(参见 15.1.2.1.1(,该函数是 包含在严格模式代码中。

  • 属于 FunctionDeclaration、FunctionExpression 或 Accessor PropertyAssignment 的函数代码是严格函数 代码,如果其 FunctionDeclaration、FunctionExpression 或 属性赋值包含在严格模式代码中,或者如果函数 代码以包含使用严格指令的序言开头 命令。

  • 如果最后一个参数是 当作为 FunctionBody 处理时以指令开头的字符串 包含使用严格指令的序幕。

因此,对于在"严格作用域"中显式定义的函数,它们将继承严格模式:

function doSomethingStrict(){
    "use strict";
    // in strict mode
    function innerStrict() {
        // also in strict mode
    }
}

但是,使用 Function 构造函数创建的函数不会从其上下文中继承严格模式,因此如果您希望它们处于严格模式,则必须具有显式 "use strict"; 语句。例如,请注意eval是严格模式下的保留关键字(但不是在严格模式下(:

"use strict";
var doSomething = new Function("var eval = 'hello'; console.log(eval);");
doSomething(); // this is ok since doSomething doesn't inherit strict mode

答案是肯定的,但您可能不会在文档中找到确切的句子,而是谈论上下文。当您在另一个函数Bar中定义一个函数Foo时,Foo是在 Bar 的上下文中创建的。如果 Bar 的上下文处于严格模式,则意味着Foo 的上下文处于严格模式。

您可以在此处查看文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope/Strict_mode

如果你考虑一下,没有这种行为是非常不切实际的(而且它没有真正的缺点(。

这也有助于使整个库使用严格模式,在连接多个脚本的情况下不会出现任何问题:

您还可以采用包装整个内容的方法 函数中的脚本,并让该外部函数使用严格模式。