javascript函数的四种调用模式


Posted in Javascript onJanuary 08, 2017

1、介绍

先介绍一下函数的调用模式有哪四种:

  •  函数调用模式,
  •  方法调用模式,
  •  构造函数调用模式,
  •  上下文调用模式;

在这里对于函数的调用模式,主要介绍每种调用模式的this的指向和返回值。

2、代码分析

①、函数调用模式

下面的调用模式就是大家最熟悉的函数调用模式,而函数调用模式的this指向和返回值是什么呢?

function fn1 () {
 console.log(this); 
};
fn1(); // 在调用函数fn1时,输出的this的结果是Window

在上述代码中,fn1也就是函数调用模式中的this是指向Window的,而返回值是由return决定。

可以得出以下结论(函数调用模式中):

  a, this是指向Window的 

  b, 返回值是由return语句决定的,如果没有return则表示没有返回值

②、方法调用模式

var name = "james";
var obj = {
  name : "wade",
 fn1 : function () {
  console.log(this.name);
 }  
};
obj.fn1(); // 在调用obj中的fn1方法函数时,输出的是wade

通过上面的代码结果分析,会得到以下结论(方法调用模式中):

  a, this 是指向调用该方法的对象

  b, 返回值还是由return语句决定,如果没有return表示没有返回值

③、构造函数调用模式

function Fn () {
 this.name = "james",
 this.age = 32,
 console.log(this)   
};
var fn1 = new Fn();// 在调用这段代码的时候,输出的是Fn {name: "james", age: 32}

通过上面的代码结果分析,会得到以下结论(构造函数调用模式中):

  a, this是指向构造函数的实例

  b, 如果没有添加返回值的话,默认的返回值是this

但是如果手动添加返回值之后呢

function Fn1 () {
 this.name = "james";
 return "wade" 
};
var fn1 = new Fn1();
console.log(fn1.name); // 这段代码输出的是 james;
function Fn2 () {
 this.name = "james";
 return [1,2,3]; 
};
var fn2 = new Fn2();
console.log(fn2.name); // 而这段代码输出的是undefined

而通过上面的代码结果分析,优化上面的结论:

  a, this是指向构造函数的实例

  b, 如果没有添加返回值的话,默认的返回值是this

  c, 如果有返回值,且返回值是简单数据类型(Number,String,Boolean··)的话,最后仍回返回this

  d, 如果有返回值,且返回值是复杂数据类型(对象)的话,最终返回该对象,所以上面的fn2是指向数组,所以fn2.name为undefined

④、上下文调用模式

function f1(){
 console.log(this);
}
f1.call(null); // Window
f1.call(undefined); // Window
f1.call(123); // Number的实例
f1.call("abc"); // String的实例
f1.call(true); // Boolean的实例
f1.call([1,2,3]); // Array的实例

通过上面的代码结果分析,得出以下结论(上下文调用模式中):

  a, 传递的参数不同,this的指向不同,this会指向传入参数的数据类型

  b, 返回值是由return决定,如果没有return表示没有返回值。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
根据出生日期自动取得星座的js代码
Jul 20 Javascript
jqgrid 简单学习笔记
May 03 Javascript
深入解析桶排序算法及Node.js上JavaScript的代码实现
Jul 06 Javascript
jQuery Easyui使用(一)之可折叠面板的布局手风琴菜单
Aug 17 Javascript
AngularJS中指令的四种基本形式实例分析
Nov 22 Javascript
jQuery焦点图左右转换效果
Dec 12 Javascript
JavaScript html5 canvas实现图片上画超链接
Oct 20 Javascript
js的函数的按值传递参数(实例讲解)
Nov 16 Javascript
记一次webpack3升级webpack4的踩坑经历
Jun 12 Javascript
微信小程序分享功能onShareAppMessage(options)用法分析
Apr 24 Javascript
js实现图片区域可点击大小随意改变(适用移动端)代码实例
Sep 11 Javascript
webpack DllPlugin xxx is not defined解决办法
Dec 13 Javascript
jquery与ajax获取特殊字符实例详解
Jan 08 #Javascript
浅谈DOM的操作以及性能优化问题-重绘重排
Jan 08 #Javascript
完美解决node.js中使用https请求报CERT_UNTRUSTED的问题
Jan 08 #Javascript
jQuery+ajax的资源回收处理机制分析
Jan 07 #Javascript
JS实现iframe自适应高度的方法示例
Jan 07 #Javascript
JS小数转换为整数的方法分析
Jan 07 #Javascript
jQuery日程管理插件fullcalendar使用详解
Jan 07 #Javascript
You might like
php中转义mysql语句的实现代码
2011/06/24 PHP
PHP超全局数组(Superglobals)介绍
2015/07/01 PHP
基于PHP实现简单的随机抽奖小程序
2016/01/05 PHP
不懂JavaScript应该怎样学
2008/04/16 Javascript
Jquery实现简单的动画效果代码
2012/03/18 Javascript
JS操作select下拉框动态变动(创建/删除/获取)
2013/06/02 Javascript
jCallout 轻松实现气泡提示功能
2013/09/22 Javascript
完美兼容各大浏览器获取HTTP_REFERER方法总结
2014/06/24 Javascript
Javascript this 关键字 详解
2014/10/22 Javascript
基于JavaScript实现回到页面顶部动画代码
2016/05/24 Javascript
vue.js中使用echarts实现数据动态刷新功能
2019/04/16 Javascript
微信小程序和百度的语音识别接口详解
2019/05/06 Javascript
vue回到顶部监听滚动事件详解
2019/08/02 Javascript
javascript 原型与原型链的理解及实例分析
2019/11/23 Javascript
Javascript Worker子线程代码实例
2020/02/20 Javascript
React中使用Vditor自定义图片详解
2020/12/25 Javascript
Python去掉字符串中空格的方法
2014/03/11 Python
Python作用域用法实例详解
2016/03/15 Python
Python简单实现socket信息发送与监听功能示例
2018/01/03 Python
TensorFlow用expand_dim()来增加维度的方法
2018/07/26 Python
Python3 执行Linux Bash命令的方法
2019/07/12 Python
python操作excel让工作自动化
2019/08/09 Python
使用Python的datetime库处理时间(RPA流程)
2019/11/24 Python
python getopt模块使用实例解析
2019/12/18 Python
Under Armour安德玛英国官网:美国高端运动科技品牌
2018/09/17 全球购物
极简鞋类,赤脚的感觉:Lems Shoes
2019/08/06 全球购物
static关键字的用法
2013/10/07 面试题
经销商会议欢迎词
2014/01/11 职场文书
客服部班长工作责任制
2014/02/25 职场文书
幼儿园教师岗位职责
2014/03/17 职场文书
学校安全生产月活动总结
2014/07/05 职场文书
学习心理学的体会
2014/11/07 职场文书
2014年房地产工作总结范文
2014/11/19 职场文书
2014年高二班主任工作总结
2014/12/16 职场文书
合同审查法律意见书
2015/06/04 职场文书
python中如何对多变量连续赋值
2021/06/03 Python