2016-11-10
最基本的:this指代的是调用函数的对象
函数的调用分4种情况:a:对象调用,b:普通函数调用,c:构造函数调用,d:call和apply调用。
下面分别对各种调用方法中的this进行分析。
1 对象中的this
1 var a="b"; 2 3 var obj={ 4 name:"a", 5 say:function(){ 6 console.log("Hello "+this.name); 7 } 8 } 9 10 obj.say();// "Hello a"
说明:该this绑定的是obj这个对象,也可以理解为调用这个函数的对象
exam:
var xx=obj.say; xx();// “nodejs环境下为Hello undefined,浏览器环境下为Hello b”;
2 function中的this
1 function setb(xx){ 2 this.b=xx; 3 } 4 var o={b:1}; 5 o.setb(2);//b=2;
说明:this绑定的是调用该函数的对象,在setb(1)中this指代的window或global对象。
3 构造函数中的this
1 function A(){ 2 this.name="a"; 3 this.age=10; 4 }
说明:this绑定的是这个构造函数。构造函数通过new关键字来调用,过程为:首先新建一个对象,并将该对象的prototype设置为该函数,调用函数时将this绑定新建的对象
4 call和apply
补充
在浏览器中和在nodejs中定义全局变量是不一样的。浏览器中var x=1;就可以将x设置为window全局变量,而在nodejs中,声明全局变量为x=1;nodejs中var x=1;声明的并不是全局变量。
分别在浏览器和nodejs环境中运行test函数。
1 var x = 1; 2 function test(){ 3 console.log (this.x); 4 }
浏览器环境下得到的是1,nodejs环境下是undefined。
参考:
http://www.ruanyifeng.com/blog/2010/04/using_this_keyword_in_javascript.html