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


浙公网安备 33010602011771号