无法在严格模式下创建对象属性

时间:2012-06-12 15:01:33

标签: javascript mode strict

如果我使用严格模式,则以下代码不起作用。它在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);

1 个答案:

答案 0 :(得分:3)

在严格模式下,this不会引用窗口。在您的示例中,删除strict mode指令将导致this引用窗口。

由于在严格模式下,示例中的thisundefined,因此出现错误。那是因为你不能在undefined的某些东西上设置属性。

来自MDN(强调与您的情况相关的部分):

  

首先,在严格模式下传递给函数的值不是   盒装成一个物体。对于普通函数,这始终是一个对象:   如果使用对象值调用,则提供对象;价值,   盒装,如果使用布尔值,字符串或数字调用;或全球   如果使用undefined或null 调用此对象...   自动装箱是一种性能成本,但在浏览器中暴露全局对象存在安全隐患,因为全局对象提供对“安全”JavaScript环境必须限制的功能的访问。因此,对于严格模式函数,指定的此函数未更改