js中的this

js中的this一直是看了又忘,其实不光是this,js中的很多东西都是这样看了就忘,不知道是只有我是这样,还是我真的不适合学js,之前学其他语言感觉都没这么困难,很多概念都搞不懂。
那么,说回this,函数被调用执行时,变量对象会被生成(准确来说此时是活动对象了),此时this指向才被确定。
当前函数的this是在函数被调用执行的时候才确定的。如果当前的执行上下文处于函数执行栈的栈顶,那么这个时候变量对象会变成活动对象,同时this的指向确定。因为是在执行时this指向才被确定,所以函数内部的this指向非常灵活且不确定。同时会因为调用方式的不同,内部的this指向不同对象。
一般来说分这三种情况:
1.对象.函数() 指向对象
2.独立调用,指向undefined,非严格模式下自动转向window(要注意不是说在全局下独立调用才指向window,而是说在任何位置,独立调用 函数()就会按照这样的规则)

var name='shuhe'
var obj={
    name:'keji',
    foo1:function(){
        console.log(this);
    }
}
var obj1={
    name:'hehe',
    foo:function(){
        var foo1=obj.foo1
        foo1()
    }
}
obj1.foo()
//指向全局

3.call,apply,bind,改变this指向。指向传入的对象,如果传入的是null,那么指向全局。

var name='shuhe'
var obj={
    name:'keji',
    foo1:function(){
        console.log(this);
    }
}
var obj1={
    name:'hehe',
    foo:function(){
        obj.foo1.call(null)
    }
}
obj1.foo()

这几天有个笔试题,然后发现自己对this掌握的并不好。

var name='shuhe'
var obj={
    name:'keji',
    foo:function(){
        console.log(this);
        (function(){
            console.log(this);
        })();
        (()=>{
            console.log(this)
        })();
    }
}
let res=obj.foo.bind({name:"latte"})
res()

我们来分析,

let res=obj.foo.bind({name:"latte"})

这一句绑定了新对象{name:“latte”},然后返回一个改变了this指向的新函数给res。
下一步调用res。然后一看这不是独立调用吗?但函数内部this仍是指向了bind绑定后的对象。原因暂且不知,真好,以为填了一个坑,结果又出来一个疑惑,js真是太让我奔溃了。
继续看,函数内部this指向{name:“latte”}那么,第一个console.log(this);打印{name:“latte”},

(function(){
      console.log(this);
})();

独立调用,指向全局

(()=>{
   console.log(this)
})();

箭头函数的this对象是定义该函数时所在的作用域指向的对象,也就是说是foo的作用域指向的对象。也就是{name:“latte”},

上一篇:mssql数据库游标批量修改符合条件的记录


下一篇:谈一下如何设计Oracle 分区表