之前对JS中的this有理解,但是一直形容不出,也写不出一些例子说明问题。然后看到了一片博文,亲自写了demo所以记录一下。
在 ES5 中,其实 this 的指向,始终坚持一个原理:this 永远指向最后调用它的那个对象,来,跟着我朗读三遍:this 永远指向最后调用它的那个对象,this 永远指向最后调用它的那个对象,this 永远指向最后调用它的那个对象。记住这句话,this 你已经了解一半了。
例1:
var name = 'windowsName'
function a() {
var name = 'yang'
console.log(this.name) // windowsName
console.log('inner' + this)// 最后调用a函数的是Window。指向 window
}
a()
console.log('outer' + this) //window
因为根据刚刚的那句话
this
永远指向最后调用它的那个对象”,我们看最后调用a
的地方a()
;,前面没有调用的对象那么就是全局对象window
,这就相当于是window.a()
;
例2:
var name = 'windowName'
var a = {
name: 'yang',
fn: function () {
console.log(this.name); // yang
}
}
a.fn();
回顾一下开始的那句话
this
永远指向最后调用它的那个对象,fn
是a
调用的所以指向了a
。
例3:
做一点小小的改动
var name = 'windowName'
var a = {
name: 'yang',
fn: function () {
console.log(this.name) // yang
}
}
window.a.fn();
回顾一下开始的那句话
this
永远指向最后调用它的那个对象,fn
是a
最后最后最后调用的,所以log了a.name
。
例4:
var name = 'windowName'
var a = {
fn: function () {
console.log(this.name) // undefined
}
}
window.a.fn();
回顾一下开始的那句话
this
永远指向最后调用它的那个对象,a
中并没有name
,所以undefined
了。
这个例子还是说明了:this
永远指向最后调用它的那个对象,因为最后调用fn
的对象是a
,所以就算a
中没有name
这个属性,也不会继续向上一个对象寻找this.name
,而是直接输出undefined
。
例 5:
var name = 'windowName'
var a = {
name: null,
fn: function () {
console.log(this.name) // windowName
}
}
var f = a.fn;
f();
将
a
对象的fn
方法赋值给变量f
了,但是没有调用,再接着跟我念这一句话:“this
永远指向最后调用它的那个对象”,由于刚刚的f
并没有调用,所以fn()
最后仍然是被window
调用的。所以this
指向的也就是window
。
由以上五个例子我们可以看出,this
的指向并不是在创建的时候就可以确定的,在es5
中,永远是this
永远指向最后调用它的那个对象。
例6:
var name = 'windowName'
function fn () {
var name = 'yang';
innerFunction();
function innerFunction() {
console.log(this.name) // windowName
}
}
fn();
最后调用
fn()
的还是window
。