this

之前对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永远指向最后调用它的那个对象,fna调用的所以指向了a

例3:

做一点小小的改动
var name = 'windowName'
var a = {
    name: 'yang',
    fn: function () {
        console.log(this.name) // yang 
    }
}
window.a.fn();

回顾一下开始的那句话this永远指向最后调用它的那个对象,fna最后最后最后调用的,所以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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容