函数、变量申明提升和闭包
一、 函数、变量申明提升
var变量和具名函数的申明会提升到 定义时的作用域的最顶部
var变量提升的是变量名,函数申明提升的是整个函数
function f(shouldInitialize: boolean) {
if (shouldInitialize) {
var x = 10;
}
return x;
}
f(true); // returns '10'
f(false); // returns 'undefined'
-----------------------------------------------------
// 提升后结果
function f(shouldInitialize: boolean) {
var x ;
if (shouldInitialize) {
x = 10;
}
return x;
}
f(true); // returns '10'
f(false); // returns 'undefined'
// 变量申明了,但没有赋值,打印时为undefined; 变量未申明,打印时会报错)
function f() {
var a = 1;
a = 2;
var b = g();
a = 3;
return b;
function g() {
return a;
}
}
f(); // returns 2
-----------------------------------------------------
// 提升后结果
function f() {
var a;
function g() {
return a;
}
a = 1;
a = 2;
var b = g();
a = 3;
return b;
}
f(); // returns 2
二、 闭包
以前不明白为什么它会每次递加,因为f函数return的内部函数被存进了变量g,g是全局变量,不会被垃圾回收机制回收,即私有变量a不会被释放。所以下次再调用g()的时候,每次a都是在原有的基础上+1。
参考文章链接2
若想释放闭包,需要将不再使用的闭包实例手工删除:g=null,此时a,b被GC回收
function f() {
var a = 10;
return function g() {
a = a + 1;
return a;
}
}
var g = f();
console.log(g()); // 11
console.log(g()); // 12
console.log(g()); // 13
// 此处函数每次执行,访问的是同一作用域中的变量var a,每次执行时a都+1
function f() {
var a = 10;
return function g() {
var b = a + 1;
return b;
}
}
// 提升后结果
function f() {
var a , b ;
a = 10;
return function g() {
b = a + 1;
return b;
}
}
var g = f();
console.log(g()); // 11
console.log(g()); // 11
console.log(g()); // 11
// 此处函数每次执行,访问的是同一作用域中的变量var a,b,
// 而var a没有再重新赋值 ,即每次访问时变量 a =10 , b = a+1,故b始终为11(首次b为undefined)
函数内部变量作用域是在函数申明的地方决定的,而非调用的地方
function f() {
var a = 1;
a = 2;
return g; // ** 此处并未形成闭包 **
// g函数中的变量a为全局的var a=10,而非外部函数f的私有变量a
// 函数内部变量作用域是在函数申明的地方决定的,而非调用的地方
}
var a = 10;
function g() {
return a;
}
console.log(f()()); // 10