Не могу использовать "скачать" в качестве имени функции в 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. Насколько я знаю, это не зарезервированное ключевое слово, что бы это могло быть?

2 ответа

Решение

<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 при нажатии.

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

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

Другие вопросы по тегам