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 相关文章推荐
Prototype1.6 JS 官方下载地址
Nov 30 Javascript
js利用与或运算符优先级实现if else条件判断表达式
Apr 15 Javascript
JS 如何获取radio选中后的值及不选择取radio的值
Oct 28 Javascript
js中split和replace的用法实例
Feb 28 Javascript
JavaScript模拟重力状态下抛物运动的方法
Mar 03 Javascript
JQuery 在文档中查找指定name的元素并移除的实现方法
May 19 Javascript
VUEJS实战之构建基础并渲染出列表(1)
Jun 13 Javascript
基于javascript中的typeof和类型判断(详解)
Oct 27 Javascript
node使用promise替代回调函数
May 07 Javascript
vue数组对象排序的实现代码
Jun 20 Javascript
基于vue开发微信小程序mpvue-docs跳转页面功能
Apr 10 Javascript
ES6 十大特性简介
Dec 09 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
使用apache模块rewrite_module (转)
2007/02/14 PHP
检查php文件中是否含有bom的函数
2012/05/31 PHP
php超快高效率统计大文件行数
2015/07/05 PHP
yii2.0实现创建简单widgets示例
2016/07/18 PHP
基于PHP的登录和注册的功能的实现
2020/08/06 PHP
自己动手制作jquery插件之自动添加删除行的实现
2011/10/13 Javascript
jquery showModelDialog的使用方法示例详解
2013/11/19 Javascript
简述JavaScript对传统文档对象模型的支持
2015/06/16 Javascript
javascript记住用户名和登录密码(两种方式)
2015/08/04 Javascript
基于jquery实现左右按钮点击的图片切换效果
2021/01/27 Javascript
BootStrap的弹出框(Popover)支持鼠标移到弹出层上弹窗层不隐藏的原因及解决办法
2016/04/03 Javascript
关于vue.js组件数据流的问题
2017/07/26 Javascript
使用vue-route 的 beforeEach 实现导航守卫(路由跳转前验证登录)功能
2018/03/22 Javascript
Vue 让元素抖动/摆动起来的实现代码
2018/05/31 Javascript
Vue父子组建的简单通信之控制开关Switch的实现
2018/06/04 Javascript
微信小程序云开发之使用云函数
2019/05/17 Javascript
使用layui实现的左侧菜单栏以及动态操作tab项方法
2019/09/10 Javascript
详解Node.JS模块 process
2020/08/31 Javascript
解决VUE项目使用Element-ui 下拉组件的验证失效问题
2020/11/07 Javascript
python 读取.csv文件数据到数组(矩阵)的实例讲解
2018/06/14 Python
Ubuntu下升级 python3.7.1流程备忘(推荐)
2018/12/10 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
2019/01/26 Python
Python实现使用request模块下载图片demo示例
2019/05/24 Python
Django接收自定义http header过程详解
2019/08/23 Python
python opencv 图像边框(填充)添加及图像混合的实现方法(末尾实现类似幻灯片渐变的效果)
2020/03/09 Python
python将logging模块封装成单独模块并实现动态切换Level方式
2020/05/12 Python
零基础学Python之前需要学c语言吗
2020/07/21 Python
如何在scrapy中捕获并处理各种异常
2020/09/28 Python
美国受欢迎的女性牛仔裤品牌:DL1961
2016/11/12 全球购物
办公室副主任岗位职责
2013/11/25 职场文书
2014国庆节幼儿园亲子活动方案
2014/09/16 职场文书
收入及婚姻状况证明
2014/11/20 职场文书
2014年初三班主任工作总结
2014/12/05 职场文书
预备党员考察意见范文
2015/06/01 职场文书
新手入门Mysql--sql执行过程
2021/06/20 MySQL
eclipse创建项目没有dynamic web的解决方法
2021/06/24 Java/Android