аргументы функции

MyExample::x является квалифицированным идентификатором , и вы поместили его в объявление перед токеном =. Это недопустимо в области блока.

9
задан Sebastian Simon 28 February 2018 в 05:45
поделиться

5 ответов

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.

12
ответ дан 4 December 2019 в 10:34
поделиться

Нет никакого способа решить эту проблему, кроме переименования одного из них или хранения значения в другой переменной.

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);
6
ответ дан 4 December 2019 в 10:34
поделиться

После того как Вы объявляете новую переменную с тем же названием старого, оно переопределяет его, и Вы не можете сослаться на обоих одновременно.

Необходимо или изменить параметр или имя переменной.

2
ответ дан 4 December 2019 в 10:34
поделиться

В 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-х предупреждениях и "неопределенный" на третьем

-1
ответ дан 4 December 2019 в 10:34
поделиться

здесь в функциональной переменной f локален для Нечто (это имеет функциональный объем), но переменная f в списке аргументов, который называют таким же образом, почему это не находится в конфликте, может быть то, потому что это связывается в объекте Foo.arguments?

Нет, это не связывается на аргументах: аргументами является только Массив значений позиционного параметра, Вы не можете получить ‘arguments.f’ из него.

Аргументы передали в функцию, по имени становятся локальными переменными. “Var f” в функции с аргументом ‘f’ неявен.

Когда Вы объявляете ‘var f’ на переменной, которая уже локальна, ничего не происходит. Ваш код идентичен:

function Foo(f)
{
    f = f;
}

На других языках мы не можем объявить переменную аргумента с тем же именем как локальная переменная.

В JavaScript пока существует одно использование “var x” в блоке объема, любое использование ‘x’ в том блоке локально. Можно счастливо объявить 'var' на той же переменной в том же объеме снова и снова, но это ничего не делает.

1
ответ дан 4 December 2019 в 10:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: