函数的四种调用模式
- 函数中的this,调用方式不同,指向不同
- this与调用有关,与定义无关
函数调用模式
- 函数名() || (function(){}()) ==> window
方法调用模式
- 对象.方法名() || 对象方法名 || 祖对象.父对象.子对象.方法名() ==> 宿主对象
构造器调用模式
- new 构造函数() || new 对象.构造函数() ==> new出来的新实例
间接调用模式(上下文调用模式)
- call
- 函数.call(指定的this,实参1,实参2,...)
- 对象.方法.call(指定的this,实参1,实参2,...)
- apply
- 函数.apply(指定的this,[实参1,实参2,...])
- 函数.apply(指定的this,{0: 实参1, 1:实参2, length: 2})
- 对象.方法.apply(指定的this,[实参1,实参2,...])
call和apply的使用范例
// 方法借用 -- 给伪数组对象添加属性值
var obj = {};
Array.protype.push.call(obj, '要添加的第一个值', '要添加的第二个值')
// 方法借用 -- 获取对象类型
var arr = [];
Object.prototype.toString.call(new Date).slice(8, -1)
// 方法借用 -- 借用父类构造函数给子类实例添加属性
function Parent(name, age) {
this.name = name;
this.age = age;
}
function Son() {
Parent.apply(this, arguments);
}
var p = new Son('火星人', 999);
// apply拆分数组或伪数组值依次传递给函数
var arr = [1, 10, 20, 40];
Math.max.apply(null, arr)