函数的四种调用模式
在JavaScript中的函数的调用模式常见的有四种:函数调用模式、方法调用模式、构造函数调用模式、上下文调用模式。
函数调用模式
就是一个简单的函数调用,函数名前面没有任何的引导内容
function test(){
}
test();
在这种调用模式情况下,this在函数中表示全局对象,在浏览器中是window对象
方法调用模式
方法一定是依附于一个对象,将函数赋值给对象的一个属性,就是方法
var obj = {
sayHi:function(){
}
}
obj.sayHi();
在这种调用模式下,this指向调用该方法的对象
构造函数调用模式
构造函数只是给this添加成员,方法也可以完成这个操作,就this而言,构造函数与方法没有本质区别
function Person(){
this.name = "zhangsan";
this.age = 20;
this.sayHello = function(){
};
}
var p = new Person();
在构造函数中的this和方法中的this一样,表示对象,但是构造函数中的对象是刚刚创建出来的对象。
上下文调用模式
- 上下文指的是函数执行的环境 就是this的指向
- 在其他三种调用模式中的this的值是不可以进行手动设置的
- 上下文模式中改变this指向的两种方法
call
语法: 函数名.call(对象)
这个方法的功能:
- 调用该函数
- 将函数内部的this指向第一个参数的对象
- 将除第一个参数外的其余参数当实参传递
function test(){
console.log(this.window);
console.log(this);
}
test();
test.call({name:"zhangsan"});
apply
语法: 函数名.apply(对象)
这个方法的功能:
- 调用该函数
- 将函数内部的this指向第一个参数里的对象
- 将第二个参数 也就是将数组中的每一个元素在函数调用的时候为改函数的每个形参赋值
第一个参数的使用规则
- 如果传入的是一个对象,那么就相当于设置该函数的this为参数
- 如果不传入参数或者传入的是null、undefined等,那么就相当于this默认为window
- 如果传入的是基本类型,那么this就是基本类型对应的包装类型的引用
number->Number
boolean->Boolean
string->String - 第二个参数的使用规则
在使用上下文调用的时候,原方法可能会带有参数,那么这个参数在上下文调用中使用第二个参数来表
上下文调用模式的应用
将伪数组转换成数组
var fakeArr = {
0:"a",
1:"b",
2:"c",
length:3
}
var arr = [];
//这里主要利用的特性就是会将apply的第二个参数依次拆开
Array.prototype.push.apply(arr, fakeArr);
//1.找到push方法
//2.改变push方法中的this指向为arr
//3.把伪数组里面的元素拆开依次交给了push方法
//相当于直接使用arr.push("a","b","c")
consloe.log(arr);
求数组的最大值
var arr = [1 ,2,3,3,4,4,34,3,43,43,43,4,34,3];
var max = Math.max.apply(null, arr);
console.log(max);
//1.先找到Math.max方法
//2.将this改为了window
//3.把arr中的每一个元素,依次赋值给Math.max的参数
//就相当于Math.max(1,2,3,43,4,3,43,43,43)