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

Posted

技术标签:

【中文标题】函数如何继承严格模式(“使用严格”;)?【英文标题】:How is strict mode ("use strict";) inherited by functions? 【发布时间】:2013-10-08 18:13:29 【问题描述】:

这是我的代码,似乎表明答案是肯定的 - 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' 的函数中定义的所有闭包和函数的声明?

【问题讨论】:

您可能需要考虑在每个函数中显式声明严格模式,否则在重构代码时会留下错误空间。 【参考方案1】:

规范的相关部分:

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

上面写着:

Code is interpreted as strict mode code in the following situations:

如果全局代码以包含 Use Strict 指令的 Directive Prologue 开头(参见 14.1),则它是严格的全局代码。

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

作为 FunctionDeclaration、FunctionExpression 或访问器 PropertyAssignment 一部分的函数代码是严格函数 如果它的 FunctionDeclaration、FunctionExpression 或 PropertyAssignment 包含在严格模式代码中,或者如果函数 代码以包含 Use Strict 的指令序言开头 指令。

如果最后一个参数是 作为 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

【讨论】:

【参考方案2】:

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

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

如果你仔细想想,没有这种行为是不切实际的(而且没有真正的缺点)。

这也有助于让您的整个库在多个脚本串联的情况下使用严格模式而不会出现任何问题:

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

【讨论】:

以上是关于函数如何继承严格模式(“使用严格”;)?的主要内容,如果未能解决你的问题,请参考以下文章

strict 严格模式

js备战春招の四の严格模式

JavaScript的严格模式

使用严格会导致未定义的功能

(11) 严格模式(use strict)

没有严格模式的 JSON.parse