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()就变成在全局环境执行。