call.apply及js用法

Posted on 2017-08-24 10:16  powerixao  阅读(131)  评论(0)    收藏  举报

在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向。

JavaScript 的一大特点是,函数存在「定义时上下文」和「运行时上下文」以及「上下文是可以改变的」这样的概念

 

数组之间追加

var array1 = [12 , "foo" , {name "Joe"} , -2458]; 

var array2 = ["Doe" , 555 , 100]; 
Array.prototype.push.apply(array1, array2); 
/* array1 值为  [12 , "foo" , {name "Joe"} , -2458 , "Doe" , 555 , 100] */
 

获取数组中的最大值和最小值

number 本身没有 max 方法,但是 Math 有,我们就可以借助 call 或者 apply 使用其方法。

var  numbers = [5, 458 , 120 , -215 ]; 

var maxInNumbers = Math.max.apply(Math, numbers),   //458
    maxInNumbers = Math.max.call(Math,5, 458 , 120 , -215); //458
 

验证是否是数组(前提是toString()方法没有被重写过)

functionisArray(obj){ 
    return Object.prototype.toString.call(obj) === '[object Array]' ;
}

类(伪)数组使用数组方法

var domNodes = Array.prototype.slice.call(document.getElementsByTagName("*"));

Javascript中存在一种名为伪数组的对象结构。比较特别的是 arguments 对象,还有像调用 getElementsByTagName , document.childNodes 之类的,它们返回NodeList对象都属于伪数组。不能应用 Array下的 push , pop 等方法。

但是我们能通过 Array.prototype.slice.call 转换为真正的数组的带有 length 属性的对象,这样 domNodes 就可以应用 Array 下的所有方法了

 

定义一个 log 方法,让它可以代理 console.log 方法,:
function log(){
  console.log.apply(console, arguments);
};
log(1);    //1
log(1,2); 
具体调用方法.apply(方法主体,参数);
 
接下来的要求是给每一个 log 消息添加一个"(app)"的前辍
该怎么做比较优雅呢?这个时候需要想到arguments参数是个伪数组,通过 Array.prototype.slice.call 转化为标准数组,再使用数组方法unshift,像这样:
function log(){
  var args = Array.prototype.slice.call(arguments);
  args.unshift('(app)');
 
  console.log.apply(console, args);
};

博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3