Не могу использовать «скачать» в качестве имени функции в JavaScript - PullRequest
16 голосов
/ 21 октября 2011

У меня была проблема с этим небольшим фрагментом:

<script>
function download() {
    alert('Hi');
}
</script>
<a href="#" onClick="javascript:download();">Test</a>

Когда я нажимаю на ссылку в Chrome 14.0, я получаю

Uncaught TypeError: string is not a function

в Firefox и IEработает просто отлично.Я решил проблему, переименовав функцию, но мне все еще любопытно, что с функцией загрузки в Chrome.Насколько я знаю, это не зарезервированное ключевое слово, так что бы это могло быть?

Ответы [ 2 ]

21 голосов
/ 21 октября 2011

<a> элементы имеют атрибут download в HTML5, как объяснено здесь , со значением по умолчанию "" (пустая строка).

Это означает, что download === this.download в обработчике onclick (this является элементом в атрибутах onevent), и, следовательно, атрибут download этого элемента превосходит свойство download window.

Эта скрипка перечисляет все строковые атрибуты, которые присутствуют по умолчанию. Вы можете видеть, что download является атрибутом, похожим на innerHTML, который также завершается с ошибкой по той же самой причине, когда используется как функция (то есть пытается обратиться к window.innerHTML, но вместо этого выполняет elem.innerHTML() ).

Как сказано в комментариях, использование window не создает путаницы относительно того, какие переменные свойства / атрибута будут оцениваться.


Такое поведение области видимости, по-видимому, связано не со значением this, а с определенной "цепочкой областей действия", которая создается.

Согласно спецификации HTML5 :

Область действия лексической среды

Пусть Scope будет результатом NewObjectEnvironment(the element's Document, the global environment).

Если у элемента есть владелец формы, пусть Scope будет результатом NewObjectEnvironment(the element's form owner, Scope).

Пусть Scope будет результатом NewObjectEnvironment(the element's object, Scope).

т.е. происходит цепочка областей действия window -> document -> element (увеличение превосходства). Это означает, что download оценивается как element.download, а не window.download. Из этого также можно сделать вывод, что getElementById будет пузыриться до document.getElementById (учитывая, что elem.getElementById не существует).

Я настроил систематический пример , чтобы вы могли видеть, как переменные всплывают в цепочке областей видимости:

window.a   = 1;
document.a = 2;
elem.a     = 3;

window.b   = 4;
document.b = 5;

window.c   = 6;

Затем <a ... onclick="console.log(a, b, c)"> регистрирует 3, 5, 6 при нажатии.

0 голосов
/ 21 октября 2011

Некоторые имена функций просто зарезервированы или уже используются. Еще бы «оценить».

Я рекомендую добавлять что-то ко всем именам функций и переменных, чтобы избежать подобных ситуаций. Пример: "sto_download"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...