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 相关文章推荐
jQuery总体架构的理解分析
Mar 07 Javascript
javascript实现tab切换特效
Nov 12 Javascript
js跨域资源共享 基础篇
Jul 02 Javascript
[原创]JavaScript语法高亮插件highlight.js用法详解【附highlight.js本站下载】
Nov 01 Javascript
Bootstrap源码解读标签、徽章、缩略图和警示框(8)
Dec 26 Javascript
详解小程序输入框闪烁及重影BUG解决方案
Aug 31 Javascript
使用mpvue搭建一个初始小程序及项目配置方法
Dec 03 Javascript
vue 动态给每个页面添加title、关键词和描述的方法
Aug 28 Javascript
vue中提示$index is not defined错误的解决方式
Sep 02 Javascript
Openlayers3实现车辆轨迹回放功能
Sep 29 Javascript
vue 中 get / delete 传递数组参数方法
Mar 23 Vue.js
代码解析React中setState同步和异步问题
Jun 03 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
判断、添加和删除WordPress置顶文章的相关PHP函数小结
2015/12/10 PHP
PHP/ThinkPHP实现批量打包下载文件的方法示例
2017/07/31 PHP
JavaScript的Function详细
2006/11/14 Javascript
js 与或运算符 || && 妙用
2009/12/09 Javascript
js 判断上传文件大小及格式代码
2013/11/13 Javascript
js利用事件的阻止冒泡实现点击空白模态框的隐藏
2014/01/24 Javascript
Nodejs学习笔记之NET模块
2015/01/13 NodeJs
jquery+ajax实现跨域请求的方法
2015/01/20 Javascript
JavaScript+html5 canvas实现本地截图教程
2020/04/16 Javascript
jquery插件jquery.dragscale.js实现拖拽改变元素大小的方法(附demo源码下载)
2016/02/25 Javascript
jquery zTree异步加载、模糊搜索简单实例分享
2016/03/24 Javascript
Bootstrap每天必学之警告框插件
2016/04/26 Javascript
angularjs实现首页轮播图效果
2017/04/14 Javascript
React-router 4 按需加载的实现方式及原理详解
2017/05/25 Javascript
关于 angularJS的一些用法
2017/11/29 Javascript
p5.js入门教程和基本形状绘制
2018/03/15 Javascript
解决vue 打包发布去#和页面空白的问题
2018/09/04 Javascript
layui 上传插件 带预览 非自动上传功能的实例(非常实用)
2019/09/23 Javascript
npx create-react-app xxx创建项目报错的解决办法
2020/02/17 Javascript
[01:55]2014DOTA2国际邀请赛 BBC正赛第一天总结
2014/07/10 DOTA
[00:32]2018DOTA2亚洲邀请赛EG出场
2018/04/03 DOTA
wxPython事件驱动实例详解
2014/09/28 Python
python定时执行指定函数的方法
2015/05/27 Python
caffe binaryproto 与 npy相互转换的实例讲解
2018/07/09 Python
python实现录音小程序
2020/10/26 Python
python中join()方法介绍
2018/10/11 Python
python实现从wind导入数据
2019/12/03 Python
pytorch下使用LSTM神经网络写诗实例
2020/01/14 Python
python如何修改文件时间属性
2021/02/05 Python
如何用Matlab和Python读取Netcdf文件
2021/02/19 Python
Book Depository美国:全球领先的专业网上书店之一
2019/08/14 全球购物
贷款委托书
2014/08/01 职场文书
教师自我剖析材料(四风问题)
2014/09/30 职场文书
派出所班子党的群众路线对照检查材料思想汇报
2014/10/01 职场文书
餐馆开业致辞
2015/08/01 职场文书
Matlab如何实现矩阵复制扩充
2021/06/02 Python