0

我尝试执行此代码:

    var system = new Object();

    (function($) {
        $.init = function() {
            var o = {
                message: function(arg) {
                    return arg.val;
                },
                alert: this.message({
                    val: "Hello, world."
                })
            };
            return o.alert;
        };
    })(system);

    alert(system.init());

但是,当我执行它时,我收到错误消息,告诉我 this.message 不是函数。显然,this不是指对象o本身,我想知道为什么。我在stackoverflow上找到了一些解决方案,this总是在函数体内,但为什么this不能在函数体内?谢谢。

4

2 回答 2

4

将您的代码更改为:

var system = new Object();

(function($) {
    $.init = function() {
        var o = {
            message: function(arg) {
                return arg.val;
            }
        };
        o.alert = o.message({
            val: "Hello, world."
        });

        return o.alert;
    };
})(system);
system.init()

产量:

"Hello, world."

在您的代码this中将引用该上下文中的窗口。如果您想创建一个对象并将其称为this- 使用构造函数,即:

var o = new function(){
    ...
    <here: this == o>
    ...
}
于 2013-07-13T14:50:41.090 回答
3

如果要在实例化期间引用对象,可以使用匿名构造函数而不是对象字面量语法。

(function($) {
    $.init = function() {
        // -----vvv---vvv---constructor function
        var o = new function() {
            this.message = function(arg) {
                return arg.val;
            },
            this.alert = this.message({
                val: "Hello, world."
            })
        };
        return o.alert;
    };
})(system);

因为 的值this仅在函数被调用时在函数内定义,所以对象字面量语法永远不会改变它的值。

因此,我们创建了一个函数,并调用它,new以便this函数中的值是对我们正在构建的新对象的引用。

当然它不需要是匿名的,但如果你只打算使用一次,就不需要名字了。

于 2013-07-13T14:54:45.707 回答