apply、call和bind的区别

  apply的call的区别数组

  其实很简单,二者的区别就在于调用时的参数不同。看一下代码:app

 1        var i = 40;
 2             
 3             var a = {
 4                 i : 20,
 5                 foo : function () {
 6                     var i = 10;
 7                     return this.i;
 8                 },
 9                 foo1 : function (param1, param2) {
10                     return param1 + param2 + i;
11                 }
12             }
13             
14             var b = {
15                 i : 5
16             }
17             
18             console.log(a.foo()); //20
19             console.log((a.foo)()); //20
20             console.log((a.foo,a.foo)()); //40
21             console.log(a.foo.apply(window)); //40
22             console.log(a.foo.apply(a)); //20
23             console.log(a.foo.apply(a.foo)); //undefinded
24             console.log(a.foo1.apply(b, [2, 1])); //43
25             console.log(a.foo1.call(b, 2, 1)); //43

  很显然,二者都是替换方法中this指向的对象,在参数上第一个参数就是替换后的对象,在第一个以后的参数就是调用方法所引用的参数。可是二者的区别就在于,apply方法的参数只有两个,第一个是替换后的对象,而第一个参数是一个数组,用于存放调用方式所引用的若干个参数而call方法的参数按照顺序是:替换后的对象,调用方法的参数1,以及若是有的话还有参数2……也就是将所要传的参数排列在第一个参数以后,总的参数的数目是不必定的函数

  若是还不清楚的话,直接看定义:this

  call方法: 
  语法:call([thisObj[,arg1[, arg2[,   [,.argN]]]]]) 
  定义:调用一个对象的一个方法,以另外一个对象替换当前对象。 
  说明: 
  call 方法能够用来代替另外一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。 
  若是没有提供 thisObj 参数,那么 Global 对象被用做 thisObj。 

  apply方法: 
  语法:apply([thisObj[,argArray]]) 
  定义:应用某一对象的一个方法,用另外一个对象替换当前对象。 
  说明: 
  若是 argArray 不是一个有效的数组或者不是 arguments 对象,那么将致使一个 TypeError。 
  若是没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用做 thisObj, 而且没法被传递任何参数。spa

  bind的用法.net

  bind方法一样是将方法中this指定的对象替换为特定的对象,可是不一样的是调用bind方法时返回的是一个函数,调用这个函数时,this所指定的对象就是bind方法中的参数,等因而固定了该方法所绑定(bind)的对象了。因此这个时候能够用一个变量来存放这个返回的方法,请看代码:code

var i = 40;

var a = {
  i :  20,
  foo : function () {
    var i = 10;
    return this.i;
  },
  foo1 : function (param1, param2) {
    return param1 + param2 + this.i;
  }
}

var b = {
  i : 5
}

console.log(a.foo()); //20
console.log(a.foo1.call(b, 2, 1)); //8

var c = a.foo.bind(b);

console.log(c); //function bound () { [native code] }
console.log(c()); //8

  能够看到在输出 c 时,输出的是一个function,说明 c 是一个函数,输出 c() 才是运算以后的结果。对象

 

参考资料:http://blog.csdn.net/shenzhennba/article/details/17716957blog

    http://uule.iteye.com/blog/1158829get

相关文章
相关标签/搜索