Подъем переменных в замыкание

В объявлении переменной javascript поднимается вверх.

Но

var v;
v=1; ----------------------------
var getValue=(function(v){
return function(){return v;};
})(v);
v=2; -----------------------------VVV

 both are outside function

but results getValue();//1

почему на этот раз v=2 не поднимается наверху?

1 ответ

Причина, по которой вы видите 1 не 2 заключается не в подъеме, а в закрытии, которое вы создаете вокруг getValue с этим IIFE, - где локальная переменная v со значением 1 тень глобальной переменной v.

var v; // hoisted declaration - global variable "v"
v=1; // "1" is assigned to the global
var getValue=(function(v) { // a function with a local "v" variable (parameter)
 return function(){return v;}; // access the local "v" variable
})(v); // passing the value of the global variable - "1" as the time of the call
v=2; // "2" is assigned to the global variable
getValue(); // the local variable still has the value: 1

Если вы опустите этот параметр, ваш getValue вернет глобальную переменную - как время вызова к ней:

var v; // hoisted declaration
// v=1; // irrelevant
var getValue = // (function() { can be omitted
 function() { return v; } // access the global variable
// })() 
v = 2; // assign the variable
getValue() // and access it from the closure: 2

licensed under cc by-sa 3.0 with attribution.