两条非常重要的知识点
首先上题
var a = '322' var preview = function() { var a = '123' console.log(a, this, this.a) } preview() // 123 window 322 //每个函数在被调用的时候 //1.自动获取两个特殊变量 arguments类数组对象 和this对象。内部函数在搜索这两个变量的时候,只会搜索到其变量对象为止。不会访问其他外部函数作用域中的这两个变量。 除非把外部函数作用域中的this保存起来,在一个闭包能够访问的变量里 //2.会创建一个执行环境及相应的作用域链。使用arguments和其他命名参数的值来初始化函数的活动对象。 //函数执行完 //用有闭包的函数执行完后 其执行环境的作用域链会被销毁(但是闭包的作用域链还在引用这个活动对象) 所以活动对象仍然保留。直到闭包被销毁
1.重点: this.a = 322而不是123 因为 this.a 是对象拿属性的方法。不是拿变量
var b = 'global' var preview = function() { var b = 'part' console.log('ground',"//", this,"//", this.b) return function() { console.log('floor',"//",b,"//", this,"//", this.b) } } preview()() //window global // part window global //证明了 this对象在全局函数 和匿名函数中都指向window
2.函数的作用域是在函数声明的时候决定的(调用自由变量也是在函数作用域内开始,与执行环境无关)