что это относится к частному методу javascript - PullRequest
3 голосов
/ 14 февраля 2010

Используя следующий бит кода:

function Node(){
 ....
 function foo(request){
        for (var name in this ) {
            log(name +" is "+this[name]);
            if(!(name == 'all' || typeof this[name] == 'function')){
                request[name] = this[name];
            }
        }
        return ...
    };
}

Я был удивлен, что когда частная функция foo вызывается this, похоже, не ссылается на содержащий объект (экземпляр Node). Почему это так?

Конечно, я мог бы иметь что-то вроде:

 function Node(){
      var ref = this;
      ....
 }

и использовать ref как this в foo, но есть ли способ объявить частные методы, для которых this является ссылкой на содержащий объект?

Ответы [ 2 ]

1 голос
/ 14 февраля 2010

'this' относится к объекту, используемому для вызова функции, который по умолчанию равен 'window'.

Используйте foo.apply (this, ...) или foo.call (this, ...) для вызова foo таким образом, что «this» в foo ссылается на «this», которое называется foo.

Соглашение, которое я использую (чтобы избежать .apply и .call):

var me = this;

function foo()
{
    // use 'me'
}

Кстати, «Я» - это ключевое слово «this» в VB.NET.

0 голосов
/ 14 февраля 2010

реализация 'this' была неправильной, но не была 'исправлена', что приводило к путанице и обходным путям.

ваш var ref=this; - это именно то, как вы бы поддерживали ссылку на ваш объект для использования его публичными / привилегированными участниками. Дуглас Крокфорд (Google it) использует var that=this;.

...