前言:
最近在写代码的时候,有很多函数调用方面的思考,简单整理,个人学习
核心思想来自以前看烂了的好书《JavaScript语言精髓》
正文:
调用一个函数将暂停当前函数的执行,传递控制权和参数给新函数。除了声明时定义的形式参数,每一个函数接收两个附加的参数: this和arguments。
关于this在下面四种函数调用方式中会主要介绍一下。
- 方法调用模式
- 函数调用模式
- 构造器调用模式
- apply和call调用模式(原书上没有加call,个人觉得加上比较好)
- 方法调用模式
当一个函数被保存为一个对象的属性时候,称为一个方法。
当一个方法被调用时候,
this被绑定到该对象。
var Obj = { value :0 , increment : function(param){ //对param进行非数字类型的默认值设置 this.value += typeof param === 'number' ? param : 1; } } Obj.increment(); //没有传参 应该返回默认值1 console.log(Obj.value); //1 Obj.increment(3); //参数为3 数值型 进行+=操作 console.log(Obj.value); //4 /* 使用了this去访问对象,能从对象中取值或修改对象 this可取得它们所属对象的上下文的方法称为公共方法 */
2. 函数调用模式
当一个函数并非像上面一样作为一个对象的属性时候,它被当做一个函数来调用
function add(a,b){ return a + b; } var sum = add(5,6); //sum 为11 /* this被绑定到全局对象,这种方式的this也是一种被称为是一种错误的指向 严格上当内部函数被调用时候,此时的this应该仍然绑定到外部函数的this变量 当然很多api的做法多是定义一个变量并给它赋值this var that = this; */
3. 构造器调用模式
//创建一个名为Obj的构造器函数 var Obj = function(param){ this.status = param; } //给Obj的所有实例提供一个getStatus的公共api Obj.prototype.getStatus = function(){ return this.status; } //构造一个Obj的实例 var obj = new Obj("over"); console.log(obj.getStatus()); //over /* 结合new前缀调用的函数被称为构造器函数 它们存在以大写格式命名的变量里面 */
4. Apply|call调用模式
这个还是比较常见的。使用原生支持的apply或者call(两个api区别可以参照我其他的文章)
function add(a,b){ return a+b; } var arr = [2,3]; /* apply(param1.param2) @param1 ----被绑定的this对象 @param2 ----一个参数数组 */ console.log(add.apply(null,arr)); //5