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 的方法重载效果
Aug 07 Javascript
Ext JS 4官方文档之三 -- 类体系概述与实践
Dec 16 Javascript
javascript 函数及作用域总结介绍
Nov 12 Javascript
javascript实现存储hmtl字符串示例
Apr 25 Javascript
window.open()详解及浏览器兼容性问题示例探讨
May 29 Javascript
自己动手手写jQuery插件总结
Jan 20 Javascript
基于JQuery的$.ajax方法进行异步请求导致页面闪烁的解决办法
May 10 Javascript
AngularJS使用ng-repeat和ng-if实现数据的删选显示效果示例【适用于表单数据的显示】
Dec 13 Javascript
PHP7新特性简述
Jun 11 Javascript
json对象及数组键值的深度大小写转换问题详解
Mar 30 Javascript
Vue2.x中利用@font-size引入字体图标报错的解决方法
Sep 28 Javascript
vue使用高德地图根据坐标定位点的实现代码
Aug 22 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
php5.3中连接sqlserver2000的两种方法(com与ODBC)
2012/12/29 PHP
Yii2使用小技巧之通过 Composer 添加 FontAwesome 字体资源
2014/06/22 PHP
php中文验证码实现方法
2015/06/18 PHP
PHP中foreach()用法汇总
2015/07/02 PHP
Laravel 5.2 文档 数据库 ―― 起步介绍
2019/10/21 PHP
javascript addBookmark 加入收藏 多浏览器兼容
2009/08/15 Javascript
20个非常棒的Jquery实用工具 国外文章
2010/01/01 Javascript
jquery实现的带缩略图的焦点图片切换(自动播放/响应鼠标动作)
2013/01/23 Javascript
原生JS实现美图瀑布流布局赏析
2015/09/07 Javascript
AngularJS基础教程之简单介绍
2015/09/27 Javascript
jQuery实现网页顶部固定导航效果代码
2015/12/24 Javascript
设计模式中的facade外观模式在JavaScript开发中的运用
2016/05/18 Javascript
理解nodejs的stream和pipe机制的原理和实现
2017/08/12 NodeJs
利用nvm管理多个版本的node.js与npm详解
2017/11/02 Javascript
利用vue.js把静态json绑定bootstrap的table方法
2018/08/28 Javascript
Angular动态绑定样式及改变UI框架样式的方法小结
2018/09/03 Javascript
基于vue实现探探滑动组件功能
2020/05/29 Javascript
js实现随机圆与矩形功能
2020/10/29 Javascript
python的staticmethod与classmethod实现实例代码
2018/02/11 Python
pycharm 在windows上编辑代码用linux执行配置的方法
2018/10/27 Python
Linux下安装python3.6和第三方库的教程详解
2018/11/09 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
2019/03/20 Python
详解Pandas之容易让人混淆的行选择和列选择
2019/07/10 Python
深度学习入门之Pytorch 数据增强的实现
2020/02/26 Python
浅析python函数式编程
2020/09/26 Python
MoviePy简介及Python视频剪辑自动化
2020/12/18 Python
html5 canvas fillRect坐标和大小的问题解决方法
2014/03/26 HTML / CSS
巴基斯坦电子产品购物网站:Home Shopping
2017/09/14 全球购物
六查六看剖析材料
2014/02/15 职场文书
少年闰土教学反思
2014/02/22 职场文书
2014年大学生村官工作总结
2014/11/19 职场文书
2015应届毕业生自荐信范文
2015/03/05 职场文书
银行求职信范文怎么写
2015/03/20 职场文书
2015年艾滋病宣传活动总结
2015/03/27 职场文书
python基于tkinter制作m3u8视频下载工具
2021/04/24 Python
修改MySQL的数据库引擎为INNODB的方法
2021/05/26 MySQL