JavaScript变量作用域和闭包

1. 变量作用域

        在JavaScript中,变量分为全局变量和局部变量,与其他高级语言不同的是,JavaScript中的局部变量的作用域为函数级作用域,即,只有在函数中声明的变量为局部变量,其他的包括在条件判断语句和循环判断语句中声明的变量均为全局变量。顾名思义,局部变量在它的作用域外无法被访问,如下所示:

var a = 1;
if (1){
	var b = 2;
}
for (var i = 0;i <= 1;i ++){}
function getC(){
	var c = 3;
}
getC();
console.log(a,b,i);	// 1 2 2
console.log(c);	// error

        需要注意的是,如果变量在函数中声明时未添加var关键词,则该变量为全局变量,更准确的说,创建的不是变量,而是window对象的一个属性。

function getC(){
	num = 1;
}
getC();
console.log(num);    // 1
console.log(window.num);    // 1
console.log(num === window.num);    // true

        在执行num=1语句时,编译器会尝试在当前作用域链中解析 num, 如果在当前作用域链中找到num,则会对num属性赋值; 如果没有找到num,它才会在全局对象(即当前作用域链的最顶层对象,如window对象)中创造num属性并赋值。因此,这种方式的“声明变量”不会出现变量提升的情况,情况如下:

function getC(){
	console.log(this.num);	// undefined
	num = 1;
	console.log(this.num);	// 1
}
getC();

2. 闭包

        由于局部变量的作用域限制在函数内,因此,函数中声明的变量只能被函数内部访问,外部想要访问函数内部变量就不易实现。闭包的作用之一就是用来访问函数内部的变量。闭包的概念复杂且不易记忆,简单来说,闭包的主要包括两种情况:一是函数作为返回值,二是函数作为参数传递。

// 查阅了很多资料,发现我对这部分的理解还是太浅薄了,有时间有能力再补上。

深入理解JavaScript闭包之什么是闭包 - SegmentFault 思否

深入理解javascript原型和闭包系列 - 王福朋 - 博客园

一文了解JS自执行函数和闭包 - 掘金

【闭包与直接 return 的区别】_iuukai的博客-CSDN博客_闭包return

[核心概念] 一文说透 JS 的作用域(scope) - 掘金

循环中的闭包 - 掘金 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值