1、作用域就是变量的可用范围(scope),用于防止变量干扰,js中有两种作用域:全局作用域、函数作用域
- 形参变量也是函数内的局部变量! function(y){} y也是函数的局部变量
2、作用域链:每个函数在定义时,就已经规划好了自己专属的一个查找变量的路线图,称为作用域链。也就是说
- 一个函数可用的所有作用域串联起来,就行成了当前函数的作用域链。
- 特殊: 给从未声明过的变量赋值,不报错,而是自动在全局创建变量
JS中,作用域和作用域链都是对象结构
- 全局作用域,一个名为window的对象,所有全局变量和全局函数都是window对象的成员。
- 函数作用域,其实是js引擎在调用函数时才临时创建的一个作用域对象。其中保存函数的局部变量。而函数调用完,
函数作用域对象就释放了。
闭包:
- 既重用变量又保护变量不被污染的一种编程方法。给一个函数,保存一个即可反复使用,又不会被外界污染的专属局部变量时,就用闭包
- 什么是闭包:闭包也是一个对象,闭包就是每次调用外层函数时,临时创建的函数作用域对象。
- 总结:外层函数调用后,外层函数的作用域对象,被返回的内层函数的作用域链引用着,无法释放,就形成了闭包对象
- 注意点:闭包藏得深,极易造成内存泄露,所以要及时将保存内层函数的变量赋值为null
题目
如何让if(a == 1 && a == 2)条件成立?
// 考察隐式转换会调用toString方法、闭包
var a = {
num: 1,
toString: function () {
return this.num++
},
}
console.log(a == 1 && a == 2)