函数、变量申明提升和闭包

函数、变量申明提升和闭包

一、 函数、变量申明提升

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
二、 闭包

参考文章链接1

以前不明白为什么它会每次递加,因为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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值