码迷,mamicode.com
首页 > 移动开发 > 详细

JavaScript中的call、apply、bind方法的区别

时间:2015-08-28 00:33:14      阅读:262      评论:0      收藏:0      [点我收藏+]

标签:

在JS中,this的指向是动态变化的,很可能在写程序的过程中,无意中破坏掉this的指向,所以我们需要一种可以把this的含义固定的技术,于是就有了call,apply和bind这三个方法

apply:应用某一对象的一个方法,用另一个对象替换当前对象。
call:调用一个对象的一个方法,以另一个对象替换当前对象。

△它们的共同之处:
都可以用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。

△它们的不同之处:
①apply:最多只能有两个参数——新this对象和一个数组 argArray。如果给该方法传递多个参数,则把参数都写进这个数组里面,当然,即使只有一个参数,也要写进数组里面。如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj,并且无法被传递任何参数。

代码示例

fun.call(thisArg[, arg1[, arg2[, ...]]])

function f(x,y){
  console.log(x+y);
}
f.call(null, 1, 1)
//return 2

②call:则是直接的参数列表,主要用在js对象各方法互相调用的时候,使当前this实例指针保持一致,或在特殊情况下需要改变this指针。如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

代码示例

fun.apply(thisArg, [argsArray])

function f(x,y){
  console.log(x+y);
}
f.call(null, [1,1])
//return 2

△总结:
apply和call功能一样,只是传入的参数列表形式不同

③bind

fun.bind(thisArg[, arg1[, arg2[, ...]]])

与上面不同的是,bind会返回一个改变this指向的新函数 ,注意这里强调的是新函数,其与之前的使用的不是同一块内存地址,所以当你需要重复使用这个函数的时候,你就不得不把其保存到一个变量,方便下次调用。上面的两个函数都是返回的执行结果,即调用即执行!

此外,另外需要注意的地方是,bind函数中的首个参数,会自动成为返回新函数中参数的默认值,那么正式调用的时候,只需要给出除首个参数外,剩余参数即可。

代码示例

function f(x,y){
  console.log(x+y);
}
f.call(null, [1,1])
var new_f = f.bind(null,1,1)
//return new function 
new_f(1) 
//return 2

 需要说明的是,上面所有示例代码中的thisArg参数均用null来代替了,在未给出指定thisArg对象的情况下,null与undefined下this指向是全局对象,即js代码执行环境。

JavaScript中的call、apply、bind方法的区别

标签:

原文地址:http://www.cnblogs.com/chenpingzhao/p/4765113.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!