jsapply Js中call和apply的区别和用法是什么
其实jsapply的问题并不复杂,但是又很多的朋友都不太了解Js中call和apply的区别和用法是什么,因此呢,今天小编就来为大家分享jsapply的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!
Js中call和apply的区别和用法是什么
JavaScript中有一个call和apply方法,其作用基本相同,但也有略微的区别。\x0d\x0a先来看看JS手册中对call的解释:\x0d\x0acall方法\x0d\x0a调用一个对象的一个方法,以另一个对象替换当前对象。\x0d\x0acall([thisObj[,arg1[, arg2[, [,.argN]]]]])\x0d\x0a参数\x0d\x0athisObj\x0d\x0a可选项。将被用作当前对象的对象。\x0d\x0aarg1, arg2,, argN\x0d\x0a可选项。将被传递方法参数序列。\x0d\x0a说明\x0d\x0acall方法可以用来代替另一个对象调用一个方法。call方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj指定的新对象。\x0d\x0a如果没有提供 thisObj参数,那么 Global对象被用作 thisObj。\x0d\x0a \x0d\x0a说明白一点其实就是更改对象的内部指针,即改变对象的this指向的内容。这在面向对象的js编程过程中有时是很有用的。\x0d\x0a\x0d\x0a\x0d\x0a function Obj(){this.value="对象!";}\x0d\x0a var value="global变量";\x0d\x0a function Fun1(){alert(this.value);}\x0d\x0a\x0d\x0a window.Fun1();//global变量\x0d\x0a Fun1.call(window);//global变量\x0d\x0a Fun1.call(document.getElementById('myText'));//input text\x0d\x0a Fun1.call(new Obj());//对象!\x0d\x0a\x0d\x0acall函数和apply方法的第一个参数都是要传入给当前对象的对象,及函数内部的this。后面的参数都是传递给当前对象的参数。\x0d\x0a运行如下代码:\x0d\x0a\x0d\x0a var func=new function(){this.a="func"}\x0d\x0a var myfunc=function(x){\x0d\x0a var a="myfunc";\x0d\x0a alert(this.a);\x0d\x0a alert(x);\x0d\x0a}\x0d\x0a myfunc.call(func,"var");\x0d\x0a\x0d\x0a可见分别弹出了func和var。到这里就对call的每个参数的意义有所了解了。\x0d\x0a\x0d\x0a对于apply和call两者在作用上是相同的,但两者在参数上有区别的。\x0d\x0a对于第一个参数意义都一样,但对第二个参数:\x0d\x0aapply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入,而call则作为call的参数传入(从第二个参数开始)。\x0d\x0a如 func.call(func1,var1,var2,var3)对应的apply写法为:func.apply(func1,[var1,var2,var3])\x0d\x0a\x0d\x0a同时使用apply的好处是可以直接将当前函数的arguments对象作为apply的第二个参数传入
JS中 call和apply的区别和作用
先说区别call和apply的参数不同,前者是call(a,b,c,...)吧所有的参数都传递。后者apply只传递两个参数apply(a,b),其中b是一个数组。这是两者最大的不同,在于后者传递的是一个数组。在大多数情况下,两个函数可以相互替换的。你可以把apply当作call的糖衣写法。就好像js里面循环函数你可以用for也可以用while一样。call和apply不是一定要怎么用的。
但是有时候apply更有用一些,比如我们需要传递一些不知道多少个数量的参数,就没法用call,而因为apply传递的是个数组,数组就比较容易适配各种参数的数量。
然后,说一说这两个函数的作用,调用一个对象的一个方法,以另一个对象替换当前对象。这是比较书面的说法,比如:a.call(b),实际上执行的是在a的领域里执行b。有点绕是不是,这里就涉及到一个作用范围的问题,在全局范围下的确可以这样用,但是在面向对象的概念中。如果a是一个对象,而b是另一个对象,那么b中没有a的方法,如何能执行b的方法呢?通过a.call(b),就让b去执行了a的方法。很神奇吧,但是,一般用不上啦,不懂就不懂吧,当你写复杂一些的js插件和比较复杂的类的的时候,就很有用啦。
javascript中apply,call和bind的区别
在JavaScript中,this的指向是动态变化的,很可能在写程序的过程中,无意中破坏掉this的指向,所以需要一种可以把this的含义固定的技术,于是就有了call,apply和bind这三个方法,来改变函数体内部 this的指向,因为函数存在「定义时上下文」和「运行时上下文」以及「上下文是可以改变的」这样的概念。
一、apply、call
apply:应用某一对象的一个方法,用另一个对象替换当前对象。
call:调用一个对象的一个方法,以另一个对象替换当前对象。
共同之处:
都可以用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为由 thisObj指定的新对象。
不同之处:
1、apply:最多只能有两个参数——新this对象和一个数组 argArray。如果给该方法传递多个参数,则把参数都写进这个数组里面,当然,即使只有一个参数,也要写进数组里面。如果 argArray不是一个有效的数组或者不是 arguments对象,那么将导致一个 TypeError。如果没有提供 argArray和 thisObj任何一个参数,那么 Global对象将被用作 thisObj,并且无法被传递任何参数。
2、call:则是直接的参数列表,主要用在js对象各方法互相调用的时候,使当前this实例指针保持一致,或在特殊情况下需要改变this指针。如果没有提供 thisObj参数,那么 Global对象被用作 thisObj。
apply和call功能一样,只是传入的参数列表形式不同,其中 thisArg是你想指定的上下文,他可以是任何一个 JavaScript对象(JavaScript中一切皆对象),call需要把参数按顺序传递进去,而 apply则是把参数放在数组里。
如果某个函数的参数数量是不固定的,当参数是明确知道数量时用 call,而不确定的时候用 apply,然后把参数 push进数组传递进去。当参数数量不确定时,函数内部也可以通过 arguments这个数组来遍历所有的参数。
二、bind
与上面不同的是,bind会返回一个改变this指向的新函数,注意这里强调的是新函数,其与之前的使用的不是同一块内存地址,所以当需要重复使用这个函数的时候,就不得不把其保存到一个变量,方便下次调用。上面的两个函数都是返回的执行结果,即调用即执行,此外,另外需要注意的地方是,bind函数中的首个参数,会自动成为返回新函数中参数的默认值,那么正式调用的时候,只需要给出除首个参数外,剩余参数即可。
当希望改变上下文环境之后并非立即执行,而是回调执行的时候,使用 bind()方法。而 apply/call则会立即执行函数。
三、三者的联系:
apply、 call、bind三者都是用来改变函数的this对象的指向的;
apply、 call、bind三者第一个参数都是this要指向的对象,也就是想指定的上下文;
apply、 call、bind三者都可以利用后续参数传参;
bind是返回对应函数,便于稍后调用;apply、call则是立即调用。
如何理解和熟练运用js中的call及apply
call和apply
obj.call(thisObj, arg1, arg2,...);
obj.apply(thisObj, [arg1, arg2,...]);
两者作用一致,都是把obj(即this)绑定到thisObj,这时候thisObj具备了obj的属性和方法。或者说thisObj『继承』了obj的属性和方法。绑定后会立即执行函数。
唯一区别是apply接受的是数组参数,call接受的是连续参数。
function add(j, k){
return j+k;
}
function sub(j, k){
return j-k;
}
我们在控制台运行:
add(5,3);//8
add.call(sub, 5, 3);//8
add.apply(sub, [5, 3]);//8
sub(5, 3);//2
sub.call(add, 5, 3);//2
sub.apply(add, [5, 3]);//2
调用原生对象的方法
示例:
var a={0:1, 1:"yjc", length: 2};
a.slice();//TypeError: a.slice is not a function
Array.prototype.slice.call(a);//[1,"yjc"]
对象a类似array,但不具备array的slice等方法。使用call绑定,这时候就可以调用slice方法。
实现继承
通过call和apply,我们可以实现对象继承。示例:
var Parent= function(){
this.name="yjc";
this.age= 22;
}
var child={};
console.log(child);//Object{},空对象
Parent.call(child);
console.log(child);//Object{name:"yjc", age: 22}
以上实现了对象的继承。
bind的使用
obj.bind(thisObj, arg1, arg2,...);
把obj绑定到thisObj,这时候thisObj具备了obj的属性和方法。与call和apply不同的是,bind绑定后不会立即执行。
同样是add()和sub():
add.bind(sub, 5, 3);//不再返回8
add.bind(sub, 5, 3)();//8
如果bind的第一个参数是null或者undefined,等于将this绑定到全局对象。
感谢您的阅读!希望本文对解决您关于jsapply的问题有所帮助。如果您还有其他疑问,欢迎随时向我们提问。