改变函数运行的对 this 对象

apply

语法: fun.apply(thisArg[, argsArray]);

function Person (name,age,sex) {
    this.name = name;
    this.age = age;
    this.sex = sex;
    return this;
}
function Group(name,age,sex){
    // apply
    Person.apply(this,arguments);
    this.say = function(){
        console.log(this.name,this.age,this.sex);
    };
}
var group = new Group("张三","20","男");
group.say() // 张三 20 

//Group 函数本身不具备任何属性, 在使用 Person.apply , 就具备了
//name, age, sex 三个属性, 在接下来使用 group.say() 方法后就能输出 张三 20 

call

语法 : fun.call(thisArg[, arg1[, arg2[, …]]])

apply 与 call() 非常相似,不同之处在于提供参数的方式。apply 使用参数数组而不是一组参数列表

function Person (name,age,sex) {
    this.name = name;
    this.age = age;
    this.sex = sex;
    return this;
}
function Group(name,age,sex){
    // call
    Person.call(this,name,age,sex);
    this.say = function(){
        console.log(this.name,this.age,this.sex);
    };
}
var group = new Group("张三","20","男");
group.say() // 张三 20 

bind

语法 : fun.bind(thisArg[, arg1[, arg2[, …]]])

bind 与 apply / call 最大的区别在于 执行后会返回一个新的函数

function demo() {
    console.log(this.name);
}
var module = demo.bind({
    name : "张三"
});
module(); // 张三