标签:
一、正文
函数内部有两个特殊对象:arguments和this。因为this是函数内部的对象,所以只能在函数内部中使用。
所有的函数调用都是作为某个对象的方法来调用的,this指向的就是调用函数的对象。
一共有四种情形:
1、对于全局函数,this指向Global(全局对象),即this=window;
2、作为某个对象的方法调用,this指向该对象;
3、作为构造函数调用,this指向由构造函数生成的新对象;
例如:
var name = ‘bison‘;
function people(){
this.name =‘kidney‘;
}
people();
alert(name); // kidney
// 此时people只是一个普通函数,在全局环境中调用,因此this指向window,于是全局属性name被改成了kidney
var name = ‘bison‘;
function people(){
this.name =‘kidney‘;
this.changeName = function(){
this.name = ‘kidney‘;
}
}
var o = new people(); // 当用new生成对象后,people就成了构造函数,this指向新生成的对象o
alert(o.name); // kidney
o.changeName(); // 运行对象方法,如果this指向全局,则全局name被修改为kidney,如果this指向对象o,那么全局name仍为bison
alert(name); // bison,说明this确实指向的是对象o
4、apply()和call()
apply的意思是应用,apply()作为函数对象的方法,其作用就是改变函数的调用对象,将函数“应用”到某个对象,此时函数内部的this指向apply方法指定的对象(由参数指定,参数为空,表示全局对象)。call的作用和apply完全一样,只是参数设置上的区别。
二、小结
由于this的易变特性,为了避免其指向的对象发生意外的改变,通常人们会提前将this储存到别的变量中。
三、解题
解答this有关的js习题,关键就是看函数是被哪个对象调用的(或者说函数是作为哪个对象的方法调用的),搞清楚调用对象,也就明白了this的指向对象。
我们来看《JavaScript高级程序设计》(第3版)P182的一道题,网上很多同类的题基本都是根据这道改编的。
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
return this.name;
};
};
};
alert(object.getNameFunc()());
// 我们对最后一句进行分解
var a = object.getNameFunc(); // a就是function(){return this.name}
var b = a(); // 在全局环境下调用,this指向全局对象,所以this.name=‘The Window‘
alert(b);// The Window
标签:
原文地址:http://www.cnblogs.com/kidney/p/5491386.html