call、apply、bind的区别

call、apply、bind都是用于改变this的指向

call、apply的原理和用法大致相同,唯一区别是传值方式,apply采用数组形式传参

call、apply会立即执行函数

function fn(num1, num2) {
    console.log(num1 + num2);
    console.log(this);
}
fn.call(obj , 100 , 200);
fn.apply(obj , [100, 200]); 

  

bind是先改变this后,调用后执行,原理上与以上二者也有所不同

var tempFn = fn.bind(obj, 1, 2);
tempFn();
 
函数三种角色的深入理解
  • 角色一:普通函数,对于Fn而言,它本身是一个普通的函数,执行的时候会形成私有的作用域,然后进行形参赋值、预解析、代码执行、执行完成后内存销毁;

  • 角色二:,它有自己的实例,f就是Fn作为类而产生的一个实例,也有一个叫做prototype的属性是自己的原型,它的实例都可以指向自己的原型;

  • 角色三:普通对象Fnvar obj = {} 中的obj一样,就是一个普通的对象(所有的函数都是Function的实例),它作为对象可以有一些自己的私有属性,也可以通过__proto__找到Function.prototype

function Fn() {
    var num = 500;
    this.x = 100;
}
Fn.prototype.getX = function () {
    console.log(this.x);
}
Fn.aaa = 1000;

var f = new Fn;

f.num // undefined
f.aaa // undefined
var res = Fn(); // res是undefined  Fn中的this是window

  

  

 

posted @ 2018-10-11 16:54  麦麦芽  阅读(209)  评论(0编辑  收藏  举报