如果我使用严格模式,则以下代码不起作用。它在this.bar ='foobar'上失败了;线。为什么会这样?如何在严格模式下创建对象属性?
<html>
<body>
<script>
"use strict";
var foo = (function () {
this.bar = 'foobar';
return this;
}());
alert(foo.bar);
</script>
</body>
</html>
修改 感谢James Allardice指出了这个问题。 我错误地认为自执行功能正在创建一个对象,但事实并非如此。我需要做以下其中一项:
"use strict";
var foo = new function () {
this.bar = 'foobar';
};
alert(foo.bar);
或(这一个JSLint更喜欢)
"use strict";
var foo = (function () {
var obj = {};
obj.bar = 'foobar';
return obj;
}());
alert(foo.bar);
答案 0 :(得分:3)
在严格模式下,this
不会引用窗口。在您的示例中,删除strict mode指令将导致this
引用窗口。
由于在严格模式下,示例中的this
为undefined
,因此出现错误。那是因为你不能在undefined
的某些东西上设置属性。
来自MDN(强调与您的情况相关的部分):
首先,在严格模式下传递给函数的值不是 盒装成一个物体。对于普通函数,这始终是一个对象: 如果使用对象值调用,则提供对象;价值, 盒装,如果使用布尔值,字符串或数字调用;或全球 如果使用undefined或null 调用此对象... 自动装箱是一种性能成本,但在浏览器中暴露全局对象存在安全隐患,因为全局对象提供对“安全”JavaScript环境必须限制的功能的访问。因此,对于严格模式函数,指定的此函数未更改