Javascript中的apply()、call()以及伪数组

每个函数都包含两个非继承而来的方法,call()和apply()

call和apply用途

这两个方法的用途都是使函数能在特定的作用域中运行(改变函数运行时的作用域),换言之就是可以设置函数中this对象的值。apply()方法接收两个参数,一个是在其中运行函数的作用域,另一个是参数数组,举一个例子:

    function product(){}
    product.prototype={
        color:"red",
        say:function(){
            console.log("my color is"+this.color);
        }
    }
    var apple = new product();
    apple.say();//my color is red
但此时我们有一个对象bananer={color:"yellow"},我们不想对它定义一个say方法,那么我们可以通过call或者apply方法借用apple中的say方法

 function product(){}
    product.prototype={
        color:"red",
        say:function(){
            console.log("my color is"+this.color);
        }
    }
    var apple = new product();
    apple.say();//my color is red
    var bananer = {color:"yellow"};
    apple.say.apply(bananer);//my color is yellow
    apple.say.call(bananer);//my color is yellow
显然,apply和call方法可以动态改变函数中的this

apply和call的区别

这两个方法的作用是一样的,仅有的一点区别是参数传递不同。

call方法需要把参数按顺序传递进去,而apply方法是将参数放在数组中传递进去。例如有一个函数定义如下:

var func=function(arg1,arg2){

};

可以通过如下方式来调用:

func.call(this,arg1,arg2);

func.apply(this,[arg1,arg2]);

所以apply方法特别适用于数组的操作。

1、数组之间的追加

push方法可以实现将一个或多个元素追加到数组末尾

例如arr.push(num1,num2,num3,...)但是不能实现将数组追加到另一个数组,此时数组可以利用apply调用push方法

var arr1=[1,2,3];
var arr2=[4,5,6];
//将arr2追加到arr1数组中
Array.prototype.push.apply(arr1,arr2);
    console.log(arr1);//[1,2,3,4,5,6]
2、求数组中最大值最小值
数组本身没有求最大最小值的方法,但是Math对象有,Math.max(number1,number2,...);Math.min(number1,number2,...)是求离散的数的最大最小值,但这种方法不能直接运用于数组中,必须把数组中的数一个一个拆分进去才能使用,此时就可以运用apply
 var arr=[1,20,30,100,50];
   console.log( Math.max.apply(Math,arr));//100
   console.log( Math.min.apply(Math,arr));//1
3、将伪数组转化为数组
 var func=function(){
        console.log(arguments instanceof Array);
    };
    func();//false



var func=function(){
   var arr=Array.prototype.slice.call(arguments);
    console.log(arr instanceof Array);
};
func();//true





伪数组
伪数组就是具有length属性的json对象。特点:
1、key是0,1,2,3...这样的形式2.具有length属性     {0:"ouyang",1:"zhaoyu",2:"fangfang",length:3}是一个典型的伪数组,但是伪数组不是数组,自然不能调用数组中的方法。js中伪数组对象很多,例如:

1.arguments  2.document.getElementsByTagName()、document.childNodes之类的,它们都返回NodeList对象都属于伪数组。  3.整个jQuery都是基于伪数组的






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值