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”},