2015-07-31 2 views
0

Почему это работает:Ссылка на объект не такой же, как объект?

var i = document.createElement("input"); 
document.body.appendChid(i); 

Но не так:

var i = document.createElement("input"); 
var f = document.body.appendChild; 
console.log(f === document.body.appendChild); //outputs true 
f(i); 

И подробности об ошибке:

TypeError: 'appendChild' called on an object that does not implement interface Node. 
+0

В первом фрагменте вы вызываете 'document.body.appendChild'; во втором вы пытаетесь вызвать 'document.appendChild'. Это опечатка? –

+0

Да, это было. Благодарим за уведомление. Но вопрос сохраняется. почему не работает? –

+1

, если вы хотите использовать 'f (i)' для выполнения 'document.body.appendChid (i)' вы можете сделать это с помощью функции: var f = function (n) {return document.body.appendChid (n)} 'также вы можете использовать 'var f = new Function ('return document.body.appendChid (n)')' –

ответ

2

В JavaScript, что выглядит как "метод" не фактически «знать», к какому объекту он привязан; по сути, это просто функция, которая, как оказалось, была сохранена как свойство некоторого объекта. Определение объекта this будет отображаться, когда вы его вызываете, в большинстве случаев на основе объекта слева от . в вызове.

Так что ваша переменная f указывает на правильную функцию, но когда она вызывается, она увидит неправильное значение this. Так как в этом случае он ожидает, что его вызывают в DOM-узле (в рабочем тесте document.body), вызывая его вне этой области, возникает ошибка.

Обратите внимание, что приведенное выше все немного упрощено, с достаточной детализацией, чтобы объяснить ваш пример. Вероятно, вы можете найти дальнейшее чтение, выполнив поиск объяснений this, а также call и apply, которые являются способами явной установки привязки функции вызова this.

Смежные вопросы