Невозможно использовать "загрузить" в качестве имени функции в javascript

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

<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. Это не зарезервированное ключевое слово, насколько я знаю, так что это может быть?

Ответы

Ответ 1

Элементы

<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 Document, the global environment).

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

Пусть Scope является результатом NewObjectEnvironment(the element object, Scope).

т.е. то, что происходит, - это целая область действия windowdocumentelement (увеличение превосходства). Это означает, что 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)"> logs 3, 5, 6 при нажатии.

Ответ 2

Некоторые имена функций просто зарезервированы или уже использованы. Другой будет "оценивать".

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