локальная копия document.getElementsByTagName - PullRequest
1 голос
/ 07 декабря 2009

Почему не работает следующий код?

var f = document.getElementsByTagName;
var x = f('div');

Я получаю «Ошибка типа: недопустимый вызов» в Chrome, «Ошибка типа: ошибка типа» в Safari. Я не получаю ошибку в Firefox, но она не работает. Я еще не удосужился протестировать IE или Opera.

Ответы [ 4 ]

7 голосов
/ 07 декабря 2009

В Javascript нет такой вещи, как «связанный метод» (заимствовать термин из Python, который, я надеюсь, вы уже знаете, или объяснение может потребоваться более длинное). Когда вы получаете ссылку на «document.getElementsByTagName», вы просто получаете ссылку на функцию , а не на метод , связанный с объектом документа. Когда вы вызываете его, «this» устанавливается в окне, а не в документе, поэтому оно не работает.

Технически это даст вам то, что вы хотите, но, как вы, вероятно, видите, это бессмысленно:

var x = f.call(document, 'div')

(Это бессмысленно, потому что это менее читабельно и не так быстро, как вызов document.getElementsByTagName (). Использование замыкания бессмысленно.)

2 голосов
/ 07 декабря 2009

потому что в javascript методы получают свои this от объекта, для которого они вызваны, а вызов метода, хранящегося в отдельной переменной, делает глобальный контекст this (или window в браузерах) , это должно работать:

var f function ()
{
    return document.getElementsByTagName.apply(
        document
      , arguments
    );
}
var x = f('div');
0 голосов
/ 07 декабря 2009

Причина в том, что getElementsByTagName необходимо вызывать для объекта. Можно сказать, что внутри определения функции она использует this, чтобы выяснить, в каком элементе искать теги. Когда вы копируете функцию и затем вызываете ее, ей будет предоставлена ​​новая область действия, что означает, что this нет указывает на другой объект. Чтобы вызвать функцию в документе, попробуйте это:

var f = document.getElementsByTagName;
var x = f.call(document, "pre");
alert(x[0]);
0 голосов
/ 07 декабря 2009

Попробуйте это:

function f(divName){
  return document.getElementById(divName);
}

var x = f('div');   

Вы пытаетесь вызвать функцию, используя круглые скобки. Проблема в том, что в вашем коде 'f' это переменная, а не функция

...