Я задал вопрос на 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???
В JavaScript вы можете вызывать функции, используя 4 различных шаблона вызова:
Шаблоны в основном различаются тем, как инициализируется параметр , этот
.
При использовании oArchive.action.test2 ()
, вы должны вызвать функцию test2 ()
с шаблоном метода, и в этом случае этот
будет привязан к действию
объект. JavaScript будет использовать шаблон метода всякий раз, когда выражение вызова содержит уточнение (например, точечное выражение .
или выражение [индекс]
).
С другой стороны, когда функция не является свойством объекта, она вызывается с использованием шаблона функции. В этом случае параметр this
привязан к глобальному объекту, и фактически именно так JavaScript вызывает вашу функцию callback ()
.
Дуглас Крокфорд в своей книге Хорошие детали описывает это как ошибку в дизайне языка и предлагает некоторые возможные обходные пути. В вашем случае одним простым решением будет вызвать обратный вызов с помощью call ()
или apply ()
, как Тим Даун предложил в вашем предыдущем вопросе :
callback.call(this);
Это работает, потому что шаблон вызова Apply / Call позволяет вам выбрать значение this
, что вам и нужно.
В javascript ключевое слово this
устанавливается для владельца функции. Функциональные объекты сами не сохраняют своего владения, вместо этого право собственности выводится из того, как мы вызываем функцию.
например:
var foo = function() {
alert('hello');
};
var abc = {};
abc.bar = foo;
Простой вызов функции, такой как
foo();
, не дает интерпретатору представления о том, к какому объекту может быть прикреплена функция. Он может быть прикреплен к нескольким объектам, это может быть переменная и т. Д. Таким образом, интерпретатор устанавливает this
глобальному объекту.
Однако при вызове такой функции, как
abc.bar();
, интерпретатор знает, что функция прикреплена к объекту abc
, поэтому для этого
устанавливается значение abc
. Даже если оба bar
и foo
относятся к одному и тому же объекту функции, разница в шаблоне вызова заставляет this
вести себя по-разному.