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)
Это, конечно, сбивает с толку.По этой причине, как правило, рекомендуется использовать переменные с разными именами на каждом уровне области видимости, а не в зависимости от маскировки, как в примере кода выше.Какой бы источник вы ни нашли, который описывает подобные вещи как «умный трюк», следует игнорировать с предубеждением.