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

apply和call

时间:2017-02-10 01:42:58      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:window   模式   解释器   依次   对象   读书笔记   表达   目的   表示   

  这里推荐一本设计模式的javascript书. 《JavaScript设计模式与开发实践》。作者是腾讯大牛曾探。

  我每天都会在里面抽出我受到的理解,作为我的读书笔记。今天就昨天讲的this里面涉及到的call和apply进行书中的讲解。

     Function.prototype.call 和 Function.prototype.apply 都是非常常用的方法。它们的作用一模 一样,区别仅在于传入参数形式的不同。 

  1.apply

    apply 接受两个参数,第一个参数指定了函数体内 this 对象的指向,第二个参数为一个带下 标的集合,这个集合可以为数组,也可以为类数组,apply 方法把这个集合中的          元素作为参数传 递给被调用的函数。

          For Example:

    var func = function( a, b, c ){

      alert ( [ a, b, c ] ); // 输出 [ 1, 2, 3 ]

      };
    func.apply( null, [ 1, 2, 3 ] );

    //参数123放进数组里面作为参数传入func,对应的参数分别 a b c

     2.call 

  call 传入的参数数量不固定,跟 apply 相同的是,第一个参数也是代表函数体内的 this 指向, 从第二个参数开始往后,每个参数被依次传入函数: 

     For Example: 

  var func = function( a, b, c ){

    alert ( [ a, b, c ] ); // 输出 [ 1, 2, 3 ]

  };
  func.call( null, 1, 2, 3 );

 

 

     当调用一个函数时,JavaScript 的解释器并不会计较形参和实参在数量、类型以及顺序上的 区别,JavaScript的参数在内部就是用一个数组来表示的。从这个意义上说,apply 比 call 的使用 率更高,我们不必关心具体有多少参数被传入函数,只要用 apply 一股脑地推过去就可以了。   

  call 是包装在 apply 上面的一颗语法糖,如果我们明确地知道函数接受多少个参数,而且想 一目了然地表达形参和实参的对应关系,那么也可以用 call 来传送参数。

  当使用 call 或者 apply 的时候,如果我们传入的第一个参数为 null,函数体内的 this 会指 向默认的宿主对象,在浏览器中则是 window:

  For Example:

  var func = function( a, b, c ){    

     alert ( this === window );    // 输出 true 

  };
  func.apply( null, [ 1, 2, 3 ] );  

  但如果是在严格模式下,函数体内的 this 还是为 null:

  For Example:
  var func = function( a, b, c ){

     "use strict"; alert ( this === null ); // 输出 true

  }
  func.apply( null, [ 1, 2, 3 ] );  

  有时候我们使用 call 或者 apply 的目的不在于指定 this 指向,而是另有用途,比如借用其 他对象的方法。那么我们可以传入 null 来代替某个具体的对象:

  For Example:
  Math.max.apply( null, [ 1, 2, 5, 3, 4 ] ) // 输出:5

 

     (未完。。。下面介绍它们的具体用途,js程序猿必会大法)

 

apply和call

标签:window   模式   解释器   依次   对象   读书笔记   表达   目的   表示   

原文地址:http://www.cnblogs.com/adouwt/p/6384613.html

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