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

call, apply 和 bind 方法

时间:2019-04-24 17:48:33      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:原函数   strong   参数   完全   环境   调用函数   script   log   一个   

  我们知道,每个函数在调用的时候会产生一个执行上下文环境,而这个执行上下文环境中包含了诸如 this 等等信息。即当我们调用函数的时候,内部的 this 已经明确地隐式绑定到了某一个对象上。如果我们希望更换 this 的指向,我们该如何更改?

  call/apply/bind 这三个函数能够满足我们的需要。

 

一个示例:

var common = ‘common‘;
var name = ‘global‘;
var obj = {
  name: ‘obj‘
}

function fn(params) {
  console.log(params + ‘ ‘ + this.name);
}

fn(common) // common global
fn.call(obj, common) // common obj

   我们可以看到,通过 call(),函数内部的 this指向了 obj 对象。

 

call/apply

// 素材函数
var func = function(arg1, arg2) {
     
};

  具体如下:

func.call(yourObj, arg1, arg2);
func.apply(yourObj, [arg1, arg2]);

  所以我们可以看出,apply 和 call 在功能上完全一致,仅仅是传参方式不一致,这样的好处是在传参个数不一定时,可以使用 apply。比如:

// 定义一个 log 方法,让它可以代理 console.log 方法

function log(){
  console.log.apply(console, arguments);
};
log(1);    //1
log(1,2);    //1 2

 

  当然,在使用 call/apply 的时候,原函数是立即执行的。

 

bind

  func.bind(yourObj,xxx,xxx) 执行之后会返回一个新函数,是 func 函数的副本,不同的是新函数内部 this 永远指向 yourObj,当然这意味着在调用 bind 完成绑定之后,需要手动执行一下这个新函数。

  其它用法/功能大致与 call 一致,不过在参数传递上有些许不一致:

function fn(a, b, c) {
    console.log(a, b, c);
}
var newFn = fn.bind(null, ‘Dot‘);

fn(‘A‘, ‘B‘, ‘C‘);            // A B C
newFn(‘A‘, ‘B‘, ‘C‘);           // Dot A B
newFn(‘B‘, ‘C‘);                // Dot B C

   可以看到,我们在 bind() 的时候传入了一个参数,新方法的实参都是在 bind 中参数的基础上在往后排。

 

call, apply 和 bind 方法

标签:原函数   strong   参数   完全   环境   调用函数   script   log   一个   

原文地址:https://www.cnblogs.com/cc-freiheit/p/10763492.html

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