JS 中的this

var obj = {
    hanshu : function (){};
}
var hanshu = obj.hanshu;

/* 调用hanshu的两种写法 */
/*第一种*/
obj.hanshu();

/*第二种*/
hanshu();

虽然obj.shanshu() 和 hanshu()都指向同一个函数,但是执行结果可能就不一样。

var obj = {
    hanshu : function (){
    console.log(this.a)
    },
a :8
}
var hanshu = obj.hanshu;
var a = 5;
/* 调用hanshu的两种写法 */
/*第一种*/
obj.hanshu();  // 8

/*第二种*/
hanshu(); //5



两者都是指向同一个函数但是运行结果却不一样,是因为函数的执行环境不同,函数体内部使用了this关键字。对于obj.hanshu()来说,hanshu运行在obj环境,所以this指向obj;对于hanshu()来说,hanshu运行在全局环境,所以this指向全局环境。所以,两者的运行结果不一样。但是为什么var hasnhu = obj.hanshu,hanshu()就变成在全局环境执行?

var obj = { a:5 }

javascript会先在内存里面生成一个对象:{ a:5 },然后把这个对象的内存地址赋值给变量obj。此时obj存的就是一个地址。读取obj{a:5}就是读取javascript生成的对象:{ a:5 }的地址。

上面代码中,函数体里面使用了变量x。该变量由运行环境提供。
现在问题就来了,由于函数可以在不同的运行环境执行,所以需要有一种机制,能够在函数体内部获得当前的运行环境(context)。所以,this就出现了,它的设计目的就是在函数体内部,指代函数当前的运行环境。
obj.foo()是通过obj找到foo,所以就是在obj环境执行。一旦var foo = obj.foo,变量foo就直接指向函数本身,所以foo()就变成在全局环境执行。

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

推荐阅读更多精彩内容