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中字符串的定义示例代码
Dec 19 Javascript
Javascript正则控制文本框只能输入整数或浮点数
Sep 02 Javascript
浅析JavaScript中的事件机制
Jun 04 Javascript
基于JavaScript实现文字超出部分隐藏
Feb 29 Javascript
使用JavaScript实现弹出层效果的简单实例
May 31 Javascript
第六篇Bootstrap表格样式介绍
Jun 21 Javascript
Wireshark基本介绍和学习TCP三次握手
Aug 15 Javascript
AngularJS 入门教程之事件处理器详解
Aug 19 Javascript
Javascript别踩白块儿(钢琴块儿)小游戏实现代码
Jul 20 Javascript
Vue2.0仿饿了么webapp单页面应用详细步骤
Jul 08 Javascript
vue+eslint+vscode配置教程
Aug 09 Javascript
Vue中keep-alive的两种应用方式
Jul 15 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
全国FM电台频率大全 - 16 河南省
2020/03/11 无线电
ThinkPHP表单自动提交验证实例教程
2014/07/18 PHP
js获取当前日期代码适用于网页头部
2013/06/27 Javascript
B/S模式项目中常用的javascript汇总
2013/12/17 Javascript
PHP使用方法重载实现动态创建属性的get和set方法
2014/11/17 Javascript
原生JS实现LOADING效果
2015/03/16 Javascript
Jquery-1.9.1源码分析系列(十一)之DOM操作
2015/11/25 Javascript
基于BootStrap环境写jQuery tabs插件
2016/07/12 Javascript
JavaScript获取select中text值的方法
2017/02/13 Javascript
ES6 Promise对象概念与用法分析
2017/04/01 Javascript
JS判断Android、iOS或浏览器的多种方法(四种方法)
2017/06/29 Javascript
js es6系列教程 - 基于new.target属性与es5改造es6的类语法
2017/09/02 Javascript
js实现弹窗猜数字游戏
2020/11/26 Javascript
[39:46]完美世界DOTA2联赛PWL S2 LBZS vs Rebirth 第二场 11.25
2020/11/25 DOTA
Python OpenCV 直方图的计算与显示的方法示例
2018/02/08 Python
python通过Windows下远程控制Linux系统
2018/06/20 Python
pycharm中显示CSS提示的知识点总结
2019/07/29 Python
Python的垃圾回收机制详解
2019/08/28 Python
python编写计算器功能
2019/10/25 Python
python 申请内存空间,用于创建多维数组的实例
2019/12/02 Python
使用tqdm显示Python代码执行进度功能
2019/12/08 Python
Python之Class&Object用法详解
2019/12/25 Python
Python基于pandas绘制散点图矩阵代码实例
2020/06/04 Python
基于TensorFlow的CNN实现Mnist手写数字识别
2020/06/17 Python
HTML5 input新增type属性color颜色拾取器的实例代码
2018/08/27 HTML / CSS
德国汉莎航空中国官网: Lufthansa中国
2017/03/30 全球购物
波兰家具和室内装饰品购物网站:Vivre
2018/04/10 全球购物
全球独特生活方式产品和礼品购物网站:AHAlife
2018/09/18 全球购物
Chinti & Parker官网:奢华羊绒女装和创新针织设计
2021/01/01 全球购物
工程力学硕士生的自我评价范文
2013/11/16 职场文书
喷漆工的岗位职责
2014/03/17 职场文书
竞选部长演讲稿
2014/04/26 职场文书
退休党员个人对照检查材料思想汇报
2014/09/29 职场文书
校本培训个人总结
2015/02/28 职场文书
2015年社区平安建设工作总结
2015/05/13 职场文书
SpringBoot+Redis实现布隆过滤器的示例代码
2022/03/17 Java/Android