MyExample::x
является квалифицированным идентификатором , и вы поместили его в объявление перед токеном =
. Это недопустимо в области блока.
JavaScript делает несколько вещей, которые не очевидно интуитивны - тот, которым Вы интересуетесь, назван "спускоподъемным" - объявления var перемещений JS к вершине функции, где они служат единственной цели зарезервировать это имя переменной как локальную переменную в объеме функции. Иногда, это приводит к большой странности. Если имя переменной уже резервируется как локальная переменная (например, это - аргумент), объявление var отбрасывается полностью.
Другая неинтуитивная часть JS - то, как это имеет дело с переменными аргумента и arguments
объект (то, которые являются немного особенными как Гиппопотам, показало). Это не обязательно, чем Вы интересуетесь, хотя - то, что важно для Вашего примера, - то, что аргументы также объявляют что имя переменной как локальное для функции.
Результат всего этого - это, когда у Вас есть a var f
а также имя аргумента f
, 'var f' отбрасывается, и Ваш пример эквивалентен:
function Foo(f) {
f = f;
}
Вы видите это в примере Гиппопотама, потому что:
function foo(f) {
console.log(f); // --> 11
console.log(arguments); // --> array [11]
var f = 10;
console.log(f); // --> 10
console.log(arguments); // --> [10] (!!!)
}
Эквивалентно:
function foo(f) {
var f;
console.log(f); // --> 11
console.log(arguments); // --> array [11]
f = 10;
console.log(f); // --> 10
console.log(arguments); // --> [10] (!!!)
}
Эквивалентно:
function foo(f) {
console.log(f); // --> 11
console.log(arguments); // --> array [11]
f = 10;
console.log(f); // --> 10
console.log(arguments); // --> [10] (!!!)
}
Для получения дополнительной информации считайте раздел 10.1.3 - Переменное Инстанцирование (нижняя часть p.37) в ECMA-262, спецификации JS.
Нет никакого способа решить эту проблему, кроме переименования одного из них или хранения значения в другой переменной.
function foo(f) {
console.log(f); // --> 11
console.log(arguments); // --> array [11]
var f=10;
console.log(f); // --> 10
console.log(arguments); //even this is now array [10]
}
foo(11);
После того как Вы объявляете новую переменную с тем же названием старого, оно переопределяет его, и Вы не можете сослаться на обоих одновременно.
Необходимо или изменить параметр или имя переменной.
В Firefox я заметил, что объявление новой переменной не делало ничего плохого, это почти, как будто stament не был там для этого
<script type="text/javascript">
function saymessage(f) {
alert(f);
var f = f;
alert(f);
alert(this.f);
}
</script>
</head>
<body >
<!-- Insert Body Here -->
<button id='link' textToShow="Hidden message text" onclick="saymessage('Hello World')">Click me </button>
</body>
Я получил "Привет Мир" на 1-х и 2-х предупреждениях и "неопределенный" на третьем
здесь в функциональной переменной f локален для Нечто (это имеет функциональный объем), но переменная f в списке аргументов, который называют таким же образом, почему это не находится в конфликте, может быть то, потому что это связывается в объекте Foo.arguments?
Нет, это не связывается на аргументах: аргументами является только Массив значений позиционного параметра, Вы не можете получить ‘arguments.f’ из него.
Аргументы передали в функцию, по имени становятся локальными переменными. “Var f” в функции с аргументом ‘f’ неявен.
Когда Вы объявляете ‘var f’ на переменной, которая уже локальна, ничего не происходит. Ваш код идентичен:
function Foo(f)
{
f = f;
}
На других языках мы не можем объявить переменную аргумента с тем же именем как локальная переменная.
В JavaScript пока существует одно использование “var x” в блоке объема, любое использование ‘x’ в том блоке локально. Можно счастливо объявить 'var' на той же переменной в том же объеме снова и снова, но это ничего не делает.