全局环境下非严格模式this指向的window,而严格模式下this指向的是undefined,严格模式这里就不解释了。
在函数定义里面使用this的时候我们是无法确定this指向谁的,只有在函数执行的时候才可以确定此时函数里面的this的指向谁,为什么这么说呢,网上大致的说法就是this指向调用的那个对象,因此this指向总给初学者一种琢磨不透高深莫测的感觉!
例子demo.html
var obj = {
name: '小明',
fn: function () {
console.log('this:obj=>', this.name)
},
}
obj.fn() //小明 此时this指向 _obj
function text() {
var names = '孙悟空'
console.log('this:text=>', this.names);
}
text() // undefined 此时this指向window
此时this最简单的理解就是谁调用的就指向谁(说法不是很正确,但是这么说就比较容易理解)
例子demo.html
var obj2 = {
name: '小红',
fn: function () {
console.log('this:obj2=>', this.name);
}
}
window.obj2.fn() //小红 此时this指向_obj2
这时候你可能在想this不是应该指向window吗,刚刚上面说的其实是可以推翻的,那只是为了更好的理解。
在函数内部调用this的话都说指向上一层的对象,如果实在全局调用this那么它就指向window
例子demo.html
var obj3 = {
name: '猪八戒',
_obj: {
_objzbj: {
fn: function () {
console.log('this:obj3=>', this.name);
}
}
}
}
obj3._obj._objzbj.fn() //undefined 此时this指向上一层的_objzbj也就是obj3._obj._objzbj这个对象
还有一种特殊情况demo.html
var obj4 = {
names: '猪八戒',
fn: function () {
console.log('this:obj4=>', this.names);
}
}
obj4.fn() // 猪八戒 此时this指向上一层的obj4也就是obj3这个对象
var objzbj = obj4.fn
objzbj() // 猪八戒 此时this指向window
当把obj4.fn赋值给objzbj的时候是把一个函数赋值给了这个变量,而这个objzbj的上一层对象指向的就是window
说了这么多相信你对this也有一定的理解了,以上就是我自己本人对this的一些理解有什么不对的请大佬指正,谢谢!