Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.6k views
in Technique[技术] by (71.8m points)

为啥this.a输出是22,应该是11,this指向window啊

this.a = 11;
        console.log(this)//window
    function test2() {
        console.log(this)//指向window
        this.a = 22
        console.log(this.a)//22?
        let b = () => {
            console.log(this.a) 
        }
        b();
    }
    test2()
    

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

先把绑定的优先级抛出结论,按照以下顺序进行判断:

  1. 函数是否在 new 中调用(new 绑定)?如果是的话,this 绑定的是新创建的对象。

    var bar = new Foo()

  2. 函数是否通过 call、apply(显式绑定)或者硬绑定调用?如果是的话, this 绑定的是指定的对象。

    var bar = foo.call(obj2)

  3. 函数是否在某个上下文对象中调用(隐式绑定)?如果是的话,this 绑定的是那个上下文对象。

    var bar = obj1.foo()

  4. 如果都不是,使用默认绑定,严格模式下,绑定到 undefined,否则绑定到全局对象。

    var bar = foo()

箭头函数默认不会使用自己的this,而是继承父执行上下文里面的this

this.a = 11;
console.log(this) // 符合条件4,所以此时的 this 是全局对象 window
console.log(window.a) // 11
function test2() {
    console.log(this) // 函数调用符合条件四,所以此时的 this 是全局对象 window
    this.a = 22  // 此时的 this 是全局对象 window,修改了window 下的 a
    console.log(this.a)// 22,此时的 this 是全局对象
    let b = () => {
        //22, 箭头函数继承父作用域的this,也就是函数作用域 test2 此时的this -- window
        console.log(this.a) 
    }
    b();
}
console.log(this.a) //输出11, 此时的 this 是全局对象 window
test2() 
console.log(this.a) //输出22, 此时的 this 是全局对象 window,

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...