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 相关文章推荐
JavaScript Cookie的读取和写入函数
Dec 08 Javascript
jQuery遍历对象、数组、集合实例
Nov 08 Javascript
javascript中的this详解
Dec 08 Javascript
JavaScript 模块的循环加载实现方法
Dec 13 Javascript
jQuery获取字符串中出现最多的数
Feb 22 Javascript
JS制作图形验证码实现代码
Oct 19 Javascript
Vue数据驱动模拟实现5
Jan 13 Javascript
jQuery上传多张图片带进度条样式(DEMO)
Mar 02 Javascript
利用Node.js了解与测量HTTP所花费的时间详解
Sep 22 Javascript
js实现手机web图片左右滑动效果
Dec 29 Javascript
jQuery中$原理实例分析
Aug 13 jQuery
理解Proxy及使用Proxy实现vue数据双向绑定操作
Jul 18 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+Tidy-完美的XHTML纠错+过滤
2007/04/10 PHP
jq的get传参数在utf-8中乱码问题的解决php版
2008/07/23 PHP
PHP下通过系统信号量加锁方式获取递增序列ID
2009/09/25 PHP
使用PHP实现密保卡功能实现代码<打包下载直接运行>
2011/10/09 PHP
CodeIgniter图像处理类的深入解析
2013/06/17 PHP
CodeIgniter框架中_remap()使用方法2例
2014/03/10 PHP
ThinkPHP实现静态缓存和动态缓存示例代码
2017/05/02 PHP
PHP中rename()函数的妙用讲解
2019/02/28 PHP
javascript 页面只自动刷新一次
2009/07/10 Javascript
js chrome浏览器判断代码
2010/03/28 Javascript
nodejs npm install全局安装和本地安装的区别
2014/06/05 NodeJs
jQuery实现“扫码阅读”功能
2015/01/21 Javascript
简介AngularJS中使用factory和service的方法
2015/06/17 Javascript
Jquery 垂直多级手风琴菜单附源码下载
2015/11/17 Javascript
JS封装通过className获取元素的函数示例
2016/12/20 Javascript
如何写好你的JavaScript【推荐】
2017/03/02 Javascript
VUE中使用Vue-resource完成交互
2017/07/21 Javascript
详解js正则表达式验证时间格式xxxx-xx-xx形式
2018/02/09 Javascript
Nodejs处理异常操作示例
2018/12/25 NodeJs
express框架下使用session的方法
2019/07/31 Javascript
JavaScript indexOf()原理及使用方法详解
2020/07/09 Javascript
vue组件中实现嵌套子组件案例
2020/08/31 Javascript
Python使用matplotlib绘制动画的方法
2015/05/20 Python
python difflib模块示例讲解
2017/09/13 Python
Python 内置函数memoryview(obj)的具体用法
2017/11/23 Python
使用Python的Django和layim实现即时通讯的方法
2018/05/25 Python
详解python中递归函数
2019/04/16 Python
python创建属于自己的单词词库 便于背单词
2019/07/30 Python
Python 序列化和反序列化库 MarshMallow 的用法实例代码
2020/02/25 Python
纯css3(无图片/js)制作的几个社交媒体网站的图标
2013/03/21 HTML / CSS
SEPHORA新西兰官方网站:购买化妆品和护肤品
2016/12/02 全球购物
行政人员岗位职责
2013/12/08 职场文书
初三化学教学反思
2014/01/23 职场文书
模范班主任事迹材料
2014/12/17 职场文书
django注册用邮箱发送验证码的实现
2021/04/18 Python
动画电影《龙珠超 超级英雄》延期上映
2022/03/20 日漫