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 相关文章推荐
JS getStyle获取最终样式函数代码
Apr 01 Javascript
javascript中日期函数new Date()的浏览器兼容性问题
Sep 05 Javascript
bootstrap布局中input输入框右侧图标点击功能
May 16 Javascript
12306 刷票脚本及稳固刷票脚本(防挂)
Jan 04 Javascript
Vue 过渡(动画)transition组件案例详解
Jan 22 Javascript
ionic实现下拉刷新载入数据功能
May 11 Javascript
AngularJs用户登录问题处理(交互及验证、阻止FQ处理)
Oct 26 Javascript
浅谈Vue.js 组件中的v-on绑定自定义事件理解
Nov 17 Javascript
详解小程序输入框闪烁及重影BUG解决方案
Aug 31 Javascript
Vee-validate 父组件获取子组件表单校验结果的实例代码
May 20 Javascript
Js参数RSA加密传输之jsencrypt.js的使用
Feb 07 Javascript
javascript代码简写的几种常用方式汇总
Aug 23 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
德生S2000收音机更换“钕铁硼”全频扬声器
2021/03/02 无线电
php数组一对一替换实现代码
2012/08/31 PHP
PHP+jQuery 注册模块的改进(三):更新到Smarty3.1
2014/10/14 PHP
php自动给网址加上链接的方法
2015/06/02 PHP
PHP 8新特性简介
2020/08/18 PHP
利用XMLHTTP传递参数在另一页面执行并刷新本页
2006/10/26 Javascript
js 判断脚本加载完毕的代码
2011/07/13 Javascript
JavaScript var声明变量背后的原理示例解析
2013/10/12 Javascript
JS+CSS 制作的超级简单的下拉菜单附图
2013/11/22 Javascript
jQuery 滑动方法slideDown向下滑动元素
2014/01/16 Javascript
利用函数的惰性载入提高javascript代码执行效率
2014/05/05 Javascript
JavaScript实现的链表数据结构实例
2015/04/02 Javascript
JS响应鼠标点击实现两个滑块区间拖动效果
2015/10/26 Javascript
基于JavaScript实现简单的随机抽奖小程序
2016/01/05 Javascript
谈一谈bootstrap响应式布局
2016/05/23 Javascript
Vue.js第四天学习笔记
2016/12/02 Javascript
微信JS SDK接入的几点注意事项(必看篇)
2017/06/23 Javascript
vue上传图片组件编写代码
2017/07/26 Javascript
jQuery实现动态添加节点与遍历节点功能示例
2017/11/09 jQuery
Nodejs libuv运行原理详解
2019/08/21 NodeJs
详解Nuxt内导航栏的两种实现方式
2020/04/16 Javascript
详解Python实现按任意键继续/退出的功能
2016/08/19 Python
浅谈python装饰器探究与参数的领取
2017/12/01 Python
Django数据库表反向生成实例解析
2018/02/06 Python
flask-restful使用总结
2018/12/04 Python
python爬虫-模拟微博登录功能
2019/09/12 Python
python应用文件读取与登录注册功能
2019/09/23 Python
python循环嵌套的多种使用方法解析
2019/11/29 Python
加拿大床上用品、家居装饰、厨房和浴室产品购物网站:Linen Chest
2018/06/05 全球购物
Mio Skincare英国官网:身体紧致及孕期身体护理
2018/08/19 全球购物
通息工程毕业生自荐信
2013/10/16 职场文书
评析教师个人的自我评价
2014/02/19 职场文书
爱心捐款倡议书
2014/04/14 职场文书
2014大学辅导员工作总结
2014/12/02 职场文书
PHP基本语法
2021/03/31 PHP
Python上下文管理器Content Manager
2021/06/26 Python