前言:
最近在写代码的时候,有很多函数调用方面的思考,简单整理,个人学习
核心思想来自以前看烂了的好书《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
1720

被折叠的 条评论
为什么被折叠?



