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原型和闭包系列 - 王福朋 - 博客园
【闭包与直接 return 的区别】_iuukai的博客-CSDN博客_闭包return