觉醒 闭包/this

两条非常重要的知识点

首先上题

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.函数的作用域是在函数声明的时候决定的(调用自由变量也是在函数作用域内开始,与执行环境无关)

猜你喜欢

转载自www.cnblogs.com/-constructor/p/12374806.html