Функции Javascript - расшифровка документации об основных функциях - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь выучить JavaScript на протяжении многих лет. Я сделал по крайней мере 10 лагерей, курсы удеми и несколько выходных. У меня до сих пор нет ответа на вопрос, почему в этом примере значение a не равно значению вне функции?

Он не вызывается в операторе функции. А внутри функции она вообще не определяется как var. Если b имеет свое значение вне функции, то почему использование переменной b, определенной внутри функции, когда она вызывается вне функции?

Где ссылка для расшифровки этих документов?

Это семантически эквивалентно форме function avg(). Это чрезвычайно мощный инструмент, так как он позволяет вам поместить полное определение функции в любое место, в которое вы обычно помещаете выражение. Это позволяет все виды хитрых трюков. Вот способ «скрыть» некоторые локальные переменные - например, область видимости блока в C:

var a = 1;
var b = 2;

(function() {
  var b = 3;
  a += b;
})();

a; // 4
b; // 2

Ответы [ 3 ]

1 голос
/ 08 мая 2019

Поскольку вы создаете новую переменную внутри функции (обратите внимание на использование var). Это было бы так же, как если бы вы написали

var a = 1;
var b = 2;

(function() {
    var someOtherName = 3;
    a += someOtherName;
})();

Просто так случилось, что переменная вне функции имела то же имя, что и переменная внутри функции. Это были совершенно разные переменные, без отношения к которым, кроме как им было дано одно и то же имя. К a добавлено 3, потому что это значение имеет локальная переменная b. Локальный b «затеняет» глобальный b.

0 голосов
/ 08 мая 2019

Не думаю, что вы думаете правильно. Когда вы создаете новый экземпляр B внутри функции, внешний B игнорируется (но это работает только внутри функции).

Поскольку вы используете A извне функции для суммирования с B внутри функции, вы получаете 4 (1 + 3) для A. С другой стороны, B все еще 2 смотрит снаружи.

0 голосов
/ 08 мая 2019

var контролирует область действия переменной;поскольку «b» переопределено как переменная внутри замыкания, на самом деле это новая переменная (которая имеет то же имя, что и переменная «b» вне замыкания). «a» повторно не объявляется с помощью «var»,поэтому внутри замыкания «а» продолжает ссылаться на глобальную переменную «а».

var a = 1;  // Global "a"
var b = 2;  // Global "b"

(function() {
  var b = 3; // "var" indicates a new "b" variable, declared inside the closure.   
             // The local "b" masks the global "b" while inside the closure.
  a += b;    // Global "a" (1) added to local "b" (3)
})();

a; // 4   (global "a")
b; // 2   (global "b", still 2, because the in-closure "b" is no longer in scope)

Это, конечно, сбивает с толку.По этой причине, как правило, рекомендуется использовать переменные с разными именами на каждом уровне области видимости, а не в зависимости от маскировки, как в примере кода выше.Какой бы источник вы ни нашли, который описывает подобные вещи как «умный трюк», следует игнорировать с предубеждением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...