在处理类数组中,发现了两种将数组方法应用于类数组的方法,现将call/apply的常用方式总结一下。
一、当做函数调用
function print_vars(var1,var2){ console.log( var1 ); console.log( var2 ); console.log( this.name ); console.log( this.age ); } var o = { name:'tester', age:16 }; print_vars.call( o,1,2);
二、作为对象的方法,给第三方使用
var arr = { "0":1, "1":2, "2":3, length:3 }; //用数组实例的every方法应用在arr上 var rst = [].every.call(arr,function(v,i,a){ return v>0; }); console.log( rst );
此处,用一个[]数组实例,来引用它的every方法的call方法;
三、作为原型的方法,给第三方使用
var arr = { "0":1, "1":2, "2":3, length:3 }; var rst = Array.prototype.every.call( arr,function(v,i,a){ return v>0; } ); console.log( "rst:"+rst );
此处,用Array的原型对象中的every方法的call方法来实现。apply的用法与call类似,只不过以数组形式传递新参而已。
面试题:如何用apply实现一个bind?bind函数在 ES5 才被加入,所以并不是所有浏览器都支持,IE8及以下的版本中不被支持,如果需要兼容可以使用 Polyfill 来实现。 bind方法与call/apply最大的区别就是bind返回一个绑定上下文的函数
首先看call和apply,第一个参数就是改变的this指向,写谁就是谁,如果是非严格模式下,传递null或undefined指向的也是window,二者唯一的区别是执行函数时,传递的参数方式不同,call是一个个的传递
相信很多朋友都会被问到过这样的一个JS问题,如何实现call | apply | bind,很多朋友只会用但是不会写,或者是死记硬背写法,等到面试官提问的时候,支支吾吾讲不清楚,今天我将教会大家完全理解这个破题!
call 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数,上述例子中,当foo函数单独调用时内部this绑定为全局对象window。
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!