【问题标题】:Can't create object properties in strict mode无法在严格模式下创建对象属性
【发布时间】:2012-06-15 11:51:38
【问题描述】:

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

【问题讨论】:

    标签: javascript mode strict


    【解决方案1】:

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

    由于在严格模式下,您示例中的thisundefined,因此您会收到错误消息。那是因为您不能为 undefined 设置属性。

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

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

    【讨论】:

    • 这不应该是指匿名函数吗?
    • 没有。如果您在严格模式之外运行,this 将引用该窗口。 this 的值取决于函数的调用方式。
    • 也值得一读:nczonline.net/blog/2012/03/13/… 搜索标题:“消除这种强制”。
    猜你喜欢
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 2017-12-31
    • 2015-05-12
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多