严格模式如何(“使用严格;)由函数继承
How is strict mode ("use strict";) inherited by functions?
这是我的代码,似乎表明答案是肯定的 - 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
如果你考虑一下,没有这种行为是非常不切实际的(而且它没有真正的缺点(。
这也有助于使整个库使用严格模式,在连接多个脚本的情况下不会出现任何问题:
您还可以采用包装整个内容的方法 函数中的脚本,并让该外部函数使用严格模式。
- Javascript嵌套函数属性继承
- 从类构造函数继承javascript
- 具有函数继承的对象扩展数组
- TypeScript 函数继承
- 由函数继承的 Javascript 变量
- 从原型继承与从构造函数继承
- 使用函数继承时相当于“实例”
- 严格模式如何(“使用严格;)由函数继承
- 从其他函数继承属性
- setTimeout 在使用函数继承时不起作用
- 通过调用祖先函数继承JavaScript
- javascript从另一个函数继承属性
- 如何从函数继承而不使用'name'所有物
- 从另一个构造函数继承会覆盖继承的构造函数的原型链中的现有属性
- 在Javascript中,如何遍历从给定构造函数继承的对象
- 用$on函数继承Angular控制器
- Javascript特权函数继承
- 测试主干扩展构造函数继承的好方法是什么?
- 一个构造函数的属性是否可能被另一个构造函数继承?
- javascript构造函数.继承另一个构造函数的原型