2

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

1 回答 1

3

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

由于在严格模式下,this在您的示例中undefined,您会收到错误消息。那是因为你不能在undefined.

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

首先,作为 this 传递给严格模式下的函数的值不会被装箱到对象中。对于普通函数, this 始终是一个对象:如果使用对象值 this 调用提供的对象;如果使用布尔值、字符串或数字调用此值,则被装箱;或者全局对象,如果使用 undefined 或 null this 调用...自动装箱是性能成本,但在浏览器中公开全局对象是一种安全隐患,因为全局对象提供对“安全”JavaScript 环境必须限制的功能的访问。因此对于严格模式函数,指定的 this 使用不变

于 2012-06-12T15:04:37.587 回答