js中call和apply的区别
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js中call和apply的区别相关的知识,希望对你有一定的参考价值。
call方法:语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]])
定义:调用一个对象的一个方法,以另一个对象替换当前对象。
说明:
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
apply方法:
语法:apply([thisObj[,argArray]])
定义:应用某一对象的一个方法,用另一个对象替换当前对象。
说明:
如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。
如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。
http://uule.iteye.com/blog/1158829 参考技术A all 方法
调用一个对象的一个方法,以另一个对象替换当前对象。
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
参数
thisObj
可选项。将被用作当前对象的对象。
arg1, arg2, , argN
可选项。将被传递方法参数序列。
说明
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
js中call,apply,bind的实现原理()
// js中call,apply,bind的实现原理()
// 三者的区别,都是改变this指针,call和apply主要是参数区别,bind返回的是一个函数体,而call和apply是立即执行
// call的实现
function fn1 (str1,str2,str3){
console.log(this,str1,str2,str3);
}
function fn2(){
}
Function.prototype.call = function (context){
// 避免传入的是基本类型,使用object进行对象化
context = context ? Object(context) : window;
context.fn = this;
let args = [];
for (let i = 1;i<arguments.length;i++) {
args.push('arguments[' + i + ']');
}
// es数组的结构
let r = eval("context.fn("+args + ")");
delete context.fn;
return r;
}
fn1.call('hellow',1,2,3);
// apply的实现原理
Function.prototype.apply = function (context,args){
// 避免传入的是基本类型,使用object进行对象化
context = context ? Object(context) : window;
context.fn = this;
if (args) {
return eval("context.fn("+args + ")");
}
let argss = [];
for (let i = 1;i<arguments.length;i++) {
argss.push(‘arguments[‘ + i + ‘]‘);
}
// es数组的结构
let r = eval("context.fn("+args + ")");
delete context.fn;
return r;
}
fn1.apply(‘hellow‘,[1,2,3]);
//bin的实现的话,改变函数不要立即执行就可以
以上是关于js中call和apply的区别的主要内容,如果未能解决你的问题,请参考以下文章