Не могу использовать "скачать" в качестве имени функции в 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"