2

次のようなオブジェクト リテラルがあります。

var test = {
    one: function() {
    },
    two: function() {
        this.one(); // call 1
        test.one(); // call 2
    }
};

関数内の呼び出しの違いは何ですかtwo(オブジェクト リテラル名を使用する場合と を使用する場合this)?

4

2 に答える 2

5

test関数のクロージャー内で常にtwo変数にバインドされますが、関数の呼び出し方法によって異なります。関数が通常のオブジェクト メンバー アクセス構文を使用して呼び出された場合、関数を所有するオブジェクトになります。testthisthis

test.two(); // inside, "this" refers to the object "test"

thisを使用して の値を変更できますFunction.prototype.call

test.two.call(bar); // inside, "this" refers to the object "bar"

ただし、関数の呼び出し方法に関係なく、 の値は関数test内で同じままです。two

于 2012-02-01T07:24:39.700 に答える
1

違いは、2 番目の呼び出しは常にテスト オブジェクトにバインドされるのに対し、これは他のオブジェクトに再バインドされる可能性があることです。

var other = {
    one: function () {
        alert('other.one');
    }
};

// call test.two as a method of object other
test.two.call(other); // calls other.one and test.one
于 2012-02-01T07:24:20.663 に答える