Почему я не могу вызвать ссылку на document.getElementById, который я сохранил в переменной? - PullRequest
2 голосов
/ 04 марта 2012

Пока я на работе, я напишу небольшие фрагменты JS для изучения самого языка, не используя какие-либо фреймворки. Однако, поскольку я ленив, я сохраню ссылку на document.getElementById, сохраняя ее в переменной:

var grab = document.getElementById;
var foo = grab('some_id');
var bar = grab('some_other_id');

Это всегда работало в IE7 / 8, но я попробовал его дома на Firefox, и ему не понравился ярлык. Теперь это работает, когда я заключаю его в функцию и закрываю аргумент:

var grab = function (some_id) {  
    return document.getElementById(some_id);  
};

но я не понимаю, зачем мне это нужно; в Firefox я могу разбрасывать ссылки на пользовательские функции, и он не жалуется:

var foo = function(x) {
    alert(x);
};
var bar = foo;
foo('foo'); // alerts 'foo'
bar('bar'); // alerts 'bar'

Почему я не могу вызвать ссылку на document.getElementById, который я сохранил в переменной?

Ответы [ 3 ]

4 голосов
/ 04 марта 2012

Это примерно this значение. Я создал тестовый пример на jsFiddle http://jsfiddle.net/pomeh/mPRZR/, чтобы показать вам проблему.

Когда вы делаете var foo = document.getElementById("...");, это значение this внутри функции является document объектом.

Когда вы делаете var grab = document.getElementById; var foo = grab("...");, вы выполняете getElementById в глобальном контексте . В этом случае значение this внутри функции является глобальным объектом, а не объектом document.

Надеюсь, это понятно для вас :) Посмотрите на пример и зарегистрированные значения.

3 голосов
/ 04 марта 2012

Это работает:

var grab = document.getElementById.bind( document );

Итак, вы используете метод функции bind, чтобы явно установить контекст для вашей grab функции.

Демонстрационная версия: http://jsfiddle.net/E2tvB/

(Примечание: вам нужно будет заполнить bind, чтобы обеспечить кросс-браузерную совместимость.)

1 голос
/ 29 июня 2017

Я обычно использую это для коротких кодов.И так далеко, я никогда не обнаруживал никаких проблем с моим методом.

var grab=function (x){return document.getElementById(x);};

grab("par").textContent="This is textContent of paragraph AFTER changed by javascript";
<html>
<body>
<p id="par">This is textContent of paragraph BEFORE changed by javascript</p>
</body>
</html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...