apply()的这种用法在Javascript中意味着什么

时间:2012-05-15 19:47:19

标签: javascript jquery web-applications

请有人告诉我this.init.apply(this, arguments)在下面的代码中做了什么?

我理解apply()的一般情况,但在下面的代码中,它在那里做了什么?

var Class = function() {

    var klass = function() {
        this.init.apply(this, arguments); //I don't really get this bit...
    };

    klass.prototype.init = function(){};

    return klass;
};

var Person = new Class;

//Usage
var someone =  new Person;

我看到很多人都在使用它。我已经知道它做了什么,但不能真正把它放在手上,所以我需要更多的光。

我在JS上升了一个级别,所以我想知道关于它的所有内容,而不仅仅是简单的'Hello world'级别。

非常感谢

1 个答案:

答案 0 :(得分:9)

apply是函数对象的成员函数。假设我们有:

function saySomething(thing, anotherThing) {
    alert(this + " says " + thing + " and " + anotherThing);
}

然后我们可以使用:

saySomething.apply(document, ["hello", "goodbye"]);

这将调用该函数并将该数组的值作为参数提供给该函数。第一个参数是函数的 context (或者,函数运行时this等于什么)。

您还应该知道arguments是一个特殊变量,它包含传递给函数的所有参数的数组。所以,在这里,this.init.apply(this, arguments)意味着调用init函数并传递所有传递给klass构造函数的参数。

在一个真实的实现中,我认为init会期望参数。考虑如何在没有apply

的情况下完成此操作
var klass = function(arg1, arg2, arg3) {
    init(arg1, arg2, arg3);
}

klass.prototype.init = function(arg1, arg2, arg3) {}

如果你想将arg4添加到init,你可以在三个地方添加它!通过让klass透明地将所有参数传递给init,您可以使代码更加脆弱。