JS中的this

        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
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值