Объекты Javascript и передача функций-членов в качестве параметров - PullRequest
3 голосов
/ 16 февраля 2012

Это трудно объяснить, может быть, лучше написать пример кода:

function A()
{
    this.b = new B();

    this.a_value = 456;

    this.f = function(i)
    {
        for(var i = 0; i < this.a_value; ++i)
            DoStuff(i);
    }

    this.b.C(this.f)
}

Я пытаюсь передать функцию в качестве аргумента B, но когда C пытается достичь a_value, она не определена. Как мне это исправить?

Надеюсь, я не упрощал мою проблему.

Ответы [ 4 ]

2 голосов
/ 16 февраля 2012

Вы можете передать this.f в функцию c, но для правильного вызова вам необходимо также передать значение this следующим образом:

function A()
{
    this.b = new B();

    this.a_value = 456;

    this.f = function(i)
    {
        for(var i = 0; i < this.a_value; ++i)
            DoStuff(i);
    }

    this.b.C(this.f, this)   // <== pass "this" here
}

And, then in `this.b.c`:

...b.c = function(fn, context) {
   fn.call(context);      // <== use .call() here to apply the right this value
}
2 голосов
/ 10 сентября 2016

Теперь (или, по-видимому, с 2015 года) вы также можете привязать функцию к экземпляру объекта, как показано в этом ответе :

this.b.C(this.f.bind(this));

В порядке объяснения:

var fn = myObject.myFunction.bind(myObject);

// The following two function calls are now equivalent
fn(123);
myObject.myFunction(123);
1 голос
/ 16 февраля 2012

Проблема в том, что this не привязан ни к какому фиксированному значению в JavaScript.Вы можете использовать замыкание, чтобы исправить это, и это, вероятно, лучший способ в этом случае:

function A()
{
    var that = this;

    this.b = new B();

    this.a_value = 456;

    this.f = function(i)
    {
        for(var i = 0; i < that.a_value; ++i)
            DoStuff(i);
    }

    this.b.C(this.f);
}
0 голосов
/ 08 октября 2016

Еще один способ добиться того же, используя функцию стрелки.Так как функции стрелок не связывают this, он сохранит любое значение, которое было при определении функции.

function A()
{
    this.b = new B();

    this.a_value = 456;

    this.f = i =>
    {
        for(var i = 0; i < this.a_value; ++i)
            DoStuff(i);
    }

    this.b.C(this.f)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...