两段代码说明 闭包,变量提升 问题
1.闭包:
var cat = { name:'Kitty', eat:function(){ console.log(this.name + ' eat food') }, closure:function(){ //1. // (function(){ // console.log(this === window) // })() //2.2 func() } } //2.1 function func(){ console.log(this === window) } cat.eat() cat.closure()
1. 和 2.2 的效果是完全一样的 因为匿名函数 并不是cat 对象的成员,等价于在全局作用域定义.
解决办法:用es6 箭头函数 也可以用var _this = this 将this 传递给闭包
(()=>{ console.log(this === cat)//true console.log(this === window)//false })() var func = ()=>{ console.log(this === window)//true }
说明:箭头函数中this的作用域是离他最近的区域的this作用域.func 最外面还是window.而里面的匿名箭头函数
是closure函数中this的作用域,因为它是cat 对象的成员所以,this 指的就是cat.
2.变量提升
//不会报错 undefined console.log(i) for(var i = 0;i < 10;i++) { console.log(i) } //值是10 9 < 10 进入循环,i又加了一次 console.log("last:" + i) //相当于 //变量被提升到了作用域的最前面 这个过程是js 代码预检查期间做的 var a; console.log(a) for(a = 0;a < 10;a++) { console.log(a) } console.log("last:" + a)
对于这种情况 es6 中的let 替换var 可以解决此问题.还有就是没有用var let const 申明的变量默认是全局变量