this代表函数运行时自动生成的一个内部对象,this只能在函数内部使用。
function test (){
this.x;
}
随着函数使用场合的不同,this的值会变化。原则是:this指的是调用函数的那个对象。
this用法小结
一、函数调用
函数的通常用法,属于全局性调用,因此this代表全局对象Global。
var x = 1;
function test(){
alert(this.x);
}
test(); //=>1
二、作为对象的方法调用
函数还可以作为某个对象的方法调用,这时this指上级对象。
function test(){
alert(this.x);
}
var o = {};
o.x = 1;
o.y = test;
o.y(); //=>1
三、作为构造函数调用
所谓构造函数,就是通过这个函数生成一个新的对象。这时this就指这个新的对象。
var x = 2;
function test(){
this.x = 1;
}
var o = new test();
alert(x); //=>2
四、apply调用
apply()是函数对象的一个方法,它的作用是改变函数的调用对象。与它类似的还有call()。apply()的第一个参数就表示改变后的调用这个函数的对象。因此,this就是这第一个参数。
var x = 0;
function test(){
alert(this.x);
}
var y = {};
y.x = 1;
y.z = test;
y.z.apply(); //=>0
apply()参数为空时,默认调用全局对象。
比较一下apply和call
作用:都是将函数绑定到另外一个对象上去运行。
区别:定义参数的方式不同。
apply(thisArg, argArray);
call(thisArg[,arg1, arg2, ……]);
所有函数内部的this指针都会被赋值为thisArg, 这用于实 现将函数作为另一个对象的方法的目的。
apply:如果argArray不是一个有效的数组或不是thisArg和thisArray任何一个参数,那么Global对象会被用作thisArg,并且无法被传递任何参数。
call:call方法可将任何一个函数的对象上下文从初始化的上下文改变为由thisArg指定的新对象。如果没有提供thisArg参数,那么Global对象被用作thisArg。
顺便提到caller和callee
caller返回一个对函数的引用,该函数调用了当前的函数。functionName.caller 对于函数来说,caller属性只有在函数执行时才有定义。如果函数是由顶层调用的,那么caller包含的就是null。如果在字符串上下文中使用caller属性,那么结果和functionName.toString一样。
callee返回正被执行的function对象,也就是说所指定function对象正文。callee属性是arguments对象的一个成员,它表示对函数对象本身的引用,这有利于匿名函数的递归,或者保证函数的封装性。而且该属性仅当相关函数正在执行时才可用。
//用callee实现递归
var sum = function(n){
if(n <= 0){
return 1;
} else {
return n + arguments.callee(n - 1);
}
}
//一般的递归
var sum = function(n){
if(1 == n){
return 1;
} else {
return n + sum(n - 1);
}
}
值得一提的时callee拥有length属性。arguments.length是实参长度,arguments.callee.length是形参长度。
再说说arguments。它代表正在执行的函数和调用它的函数的参数。它是在function中除了指定的参数外,还另外创建的一个隐藏的对象。是一个类数组,但不是数组。但它具有数组一样的访问方式及性质,可由argument[n]来访问对应的单个参数值。
//证明arguments不是数组的方法
Array.prototype.selfValue = 1;
alert(new Array().selfValue); //=>1
function test(){
alert(arguments.selfValue); //=>undefined
}