JavaScript “это” указывает на Объект окна снова

Я задал вопрос на JavaScript, на который это указывает на Объект окна относительно "этого", указывает на Объект окна.

вот исходный код

var archive = function(){} 

archive.prototype.action = { 
    test: function(callback){ 
        callback(); 
    }, 
    test2: function(){ 
        console.log(this); 
    } 
} 

var oArchive = new archive(); 
oArchive.action.test(oArchive.action.test2); 

Tim Down записал, "но что функция затем вызвана с помощью обратного вызова (), что означает, что это не называют как метод, и следовательно это - глобальный объект".

Что такое различия между называнием функции ее подлинным именем и обратным вызовом () как показано на исходном коде?

Как делает console.log, на который (это) в test2 указывает на Окно, когда это внутри archive.action???

6
задан Community 23 May 2017 в 12:30
поделиться

2 ответа

В JavaScript вы можете вызывать функции, используя 4 различных шаблона вызова:

  • Вызов функции
  • Вызов метода
  • Вызов Apply / Call
  • Вызов конструкции

Шаблоны в основном различаются тем, как инициализируется параметр , этот .

При использовании oArchive.action.test2 () , вы должны вызвать функцию test2 () с шаблоном метода, и в этом случае этот будет привязан к действию объект. JavaScript будет использовать шаблон метода всякий раз, когда выражение вызова содержит уточнение (например, точечное выражение . или выражение [индекс] ).

С другой стороны, когда функция не является свойством объекта, она вызывается с использованием шаблона функции. В этом случае параметр this привязан к глобальному объекту, и фактически именно так JavaScript вызывает вашу функцию callback () .

Дуглас Крокфорд в своей книге Хорошие детали описывает это как ошибку в дизайне языка и предлагает некоторые возможные обходные пути. В вашем случае одним простым решением будет вызвать обратный вызов с помощью call () или apply () , как Тим Даун предложил в вашем предыдущем вопросе :

callback.call(this);

Это работает, потому что шаблон вызова Apply / Call позволяет вам выбрать значение this , что вам и нужно.

10
ответ дан 8 December 2019 в 18:33
поделиться

В javascript ключевое слово this устанавливается для владельца функции. Функциональные объекты сами не сохраняют своего владения, вместо этого право собственности выводится из того, как мы вызываем функцию.

например:

var foo = function() {
    alert('hello');
};
var abc = {};
abc.bar = foo;

Простой вызов функции, такой как

foo();

, не дает интерпретатору представления о том, к какому объекту может быть прикреплена функция. Он может быть прикреплен к нескольким объектам, это может быть переменная и т. Д. Таким образом, интерпретатор устанавливает this глобальному объекту.

Однако при вызове такой функции, как

abc.bar();

, интерпретатор знает, что функция прикреплена к объекту abc , поэтому для этого устанавливается значение abc . Даже если оба bar и foo относятся к одному и тому же объекту функции, разница в шаблоне вызова заставляет this вести себя по-разному.

3
ответ дан 8 December 2019 в 18:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: