js call跟apply用法全解

ps:  将前面博文中的东西单独提取出来,废话不说直接复制。
1. 每个函数都包含两个非继承而来的方法:  call( this,arg1,arg2 ) 、apply(this,[arg1,arg2])   使用这个两个函数的好处就在于对象不需要与方法有任何耦合关系。

2 .     Function. apply (obj,args)方法能接收两个参数  
       obj:这个对象将代替Function类里this对象
 args:这个是数组,它将作为参数传给Function(args-->arguments)

   call:和apply的用法一样,只不过是参数列表不一样.

 Function.call(obj,[param1[,param2[,…[,paramN]]]])   obj:这个对象将代替Function类里this对象   params:这个是一个参数列表

轻松实现继承

function a(name,age){
this.name = name;
this.age = age;
alert(this.name+'---'+this.age)
}

function b(name,age){
a.apply(this,arguments)
}

var b1 = new b('anikin',23) // alert(anikin--23)

     call和apply可以用来重新定义函数的执行环境,也就是this的指向。通过一个操作DOM的例子来理解。

function changeStyle(attr, value){
this.style[attr] = value;
}
var box = document.getElementById('box');
window.changeStyle.call(box, "height", "200px");


call中的第一个参数用于指定将要调用此函数的对象,在这里,changeStyle函数将被box对象调用,this指向了box对象,如果不用call的话,程序报错,因为window对象中没有style属性。
apply的用法:

     
     
      
      window.changeStyle.apply(box, ['height', '200px']);
     
     
如果call或apply的第一参数是null的话, this指向window

function exam(a, b, c, d, e) {

// 先看看函数的自带属性 arguments 什么是样子的
console.log(arguments instanceof Array); // false

// 使用call/apply将arguments转换为数组, 返回结果为数组,arguments自身不会改变
var arg = [].slice.apply(null,arguments);

// var arg = [].slice.call(arguments);

console.log(arg instanceof Array); // true
return arg;
}

//exam(2, 8, 9, 10, 3); // array [2, 8, 9, 10, 3]

// 也常常使用该方法将DOM中的nodelist转换为数组
// [].slice.call( document.getElementsByTagName('li') )


用的比较多的,通过 document.getElementsByTagName 选择的dom 节点是一种类似array的array。它不能应用Array下的push,pop等方法。我们可以通过:
var domNodes = Array.prototype.slice.call(document.getElementsByTagName("*"));
这样domNodes就可以应用Array下的所有方法了。


推荐: 字符串数组

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值