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
的属性是自己的原型,它的实例都可以指向自己的原型; -
角色三:普通对象,
Fn
和var 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