call()和apply()

2016-11-30  本文已影响0人  他在发呆

方法定义:
调用一个对象的一个方法,以另一个对象替换当前对象。

    function a(){
        console.log(this);
    }
    a.call();//window
    a.call(null);//window
    a.call(undefined);//window
    a.call(1);//Number
    a.call('aaa');//String
    a.call(true);//Boolean
    a.call(a);//function(){}
    a.call({'a':'b'});//Object{}

用法

    var num=[3,23,543,2,52,-1000];
    var maxNum=Math.max.apply(this,num);
    var minNum=Math.min.call(this,num[0],num[1],num[2],num[3],num[4],num[5]);

不确定有几个参数的时候使用

    function n(){
        console.log.apply(this,arguments)
    }
    // n(1,3,'a','',{},true);

call()传入 的第一个参数作为 this,传入的第二个以及以后的参数加上绑定函数运行时本身的参数按照顺序作为原函数的参数来调用原函数,看代码进行理解

    function eat(x,y) {
          console.log(x+y);
    }
    function drink(x,y) {
           console.log(x-y);
    }
    drink.call(eat,3,2);//1
    eat.call(drink,3,2);//5

扩展bind()方法

参数用法类似于call,但call/apply 是立刻调用函数的,bind 是返回一个函数,然后可以在其他时候调用。

this.x = 9; 
var module = {
  x: 81,
  getX: function() { return this.x; }
};

console.log(module.getX()); // 81

var retrieveX = module.getX;
console.log(retrieveX());//9, 因为 this 指向全局对象
var boundGetX = retrieveX.bind(module);
console.log(boundGetX()); // 81
var person = {  
  name: "James Smith",
  hello: function(thing) {
    console.log(this.name + " says hello " + thing);
  }
}
// call
person.hello.call(person, "world"); //James Smith says hello world

// bind
var helloFunc = person.hello.bind(person);
helloFunc("world");  //James Smith says hello world

上一篇下一篇

猜你喜欢

热点阅读