JS函数内部属性之arguments和this实例解析


Posted in Javascript onOctober 07, 2018

在函数内部,有两个特殊的对象:arguments和this。

1、arguments

arguments是一个类数组对象。包含着传入函数中的所有参数。但这个对象还有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。

经典案例:阶乘函数

function factorial(num){
  if(num <= 1){
    return 1;
  }else{
    return num * factorial(num-1);
  }
}

定义阶乘函数一般都要用到递归算法,如上所示,但你会发现,这个函数的执行与函数名factorial紧紧耦合在了一起,为解决这个问题,我们可以使用arguments.callee。

function factorial(num){
  if(num <= 1){
    return 1;
  }else{
    return num * arguments.callee(num-1);
  }
}

我们重写之后,factorial()函数里没有引用函数名factorial。这样无论引用函数时使用的是什么名字,都可以保证正常完成递归调用。例如:

var trueFac = factorial;

factorial = function(){
  return 0;
}

console.log(trueFac(5)); // 120
console.log(factorial(5)); // 0

2、this

函数内部的另一个对象是this,this引用的是函数执行的环境对象(当在网页的全局作用域中调用函数时,this对象引用的就是window)。

window.color = "red";
var o = { color: "blue" };

function sayColor(){
  alert(this.color);
}

sayColor(); // "red"

o.sayColor = sayColor;
o.sayColor(); // "blue"

在上面这个函数sayColor()是在全局作用域中定义的,它引用了this对象。由于在调用函数之前,this的值并不确定,因此this可能会在代码执行过程中引用不同的对象。

当在全局作用域中调用sayColor()时,this引用的时全局对象window;换句话说,对this.color求值会转换成对window.color求值,于是结果就返回了"red"。而当把这个函数赋给对象o并调用o.sayColor()时,this引用的是对象o,因此对this.color求值会转换成对o.color求值,所以返回“blue”。

函数的名字仅仅是一个包含指针的变量。

总结

以上所述是小编给大家介绍的JS函数内部属性之arguments和this实例解析,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
javascript处理table表格的代码
Dec 06 Javascript
js日历功能对象
Jan 12 Javascript
JavaScript中的apply和call函数详解
Jul 20 Javascript
在Python中使用glob模块查找文件路径的方法
Jun 17 Javascript
js控制文本框输入的字符类型方法汇总
Jun 19 Javascript
javascript实现在线客服效果
Jul 15 Javascript
Bootstrap每天必学之导航
Nov 26 Javascript
JavaScript快速切换繁体中文和简体中文的方法及网站支持简繁体切换的绝招
Mar 07 Javascript
Vue.js自定义指令的用法与实例解析
Jan 18 Javascript
Angular在模板驱动表单中自定义校验器的方法
Aug 09 Javascript
微信小程序实现指定显示行数多余文字去掉用省略号代替
Jul 25 Javascript
微信小程序如何获取地址
Dec 24 Javascript
JS如何获取地址栏的参数实例讲解
Oct 06 #Javascript
详谈js的变量提升以及使用方法
Oct 06 #Javascript
浅析js中mvvm模式实现的原理
Oct 06 #Javascript
js for终止循环 跳出多层循环
Oct 04 #Javascript
iView-admin 动态路由问题的解决方法
Oct 03 #Javascript
Angular resolve基础用法详解
Oct 03 #Javascript
解决angularjs service中依赖注入$scope报错的问题
Oct 02 #Javascript
You might like
php记录代码执行时间(实现代码)
2013/07/05 PHP
PHP清除字符串中所有无用标签的方法
2014/12/01 PHP
php冒泡排序与快速排序实例详解
2015/12/07 PHP
PHP模板引擎Smarty内建函数foreach,foreachelse用法分析
2016/04/11 PHP
php mysql procedure实现获取多个结果集的方法【基于thinkPHP】
2016/11/09 PHP
php mysql获取表字段名称和字段信息的三种方法
2016/11/13 PHP
js 键盘记录实现(兼容FireFox和IE)
2010/02/07 Javascript
Javascript中的相等与不等运算
2010/04/25 Javascript
JavaScript 原型与继承说明
2010/06/09 Javascript
使用Grunt.js管理你项目的应用说明
2013/04/24 Javascript
js函数模拟显示桌面.scf程序示例
2014/04/20 Javascript
nodejs 实现模拟form表单上传文件
2014/07/14 NodeJs
jQuery中mouseover事件用法实例
2014/12/26 Javascript
javascript常用功能汇总
2015/07/05 Javascript
浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入
2016/01/19 Javascript
JS、jQuery中select的用法详解
2016/04/21 Javascript
通过一个简单的例子学会vuex与模块化
2017/11/22 Javascript
js中实例与对象的区别讲解
2019/01/21 Javascript
小程序实现横向滑动日历效果
2019/10/21 Javascript
Vue路由权限控制解析
2020/11/09 Javascript
[02:38]DOTA2亚洲邀请赛 IG战队巡礼
2015/02/03 DOTA
python socket 超时设置 errno 10054
2014/07/01 Python
Python 的 Socket 编程
2015/03/24 Python
python获取list下标及其值的简单方法
2016/09/12 Python
Python基础知识点 初识Python.md
2019/05/14 Python
使用python将多个excel文件合并到同一个文件的方法
2019/07/09 Python
Django shell调试models输出的SQL语句方法
2019/08/29 Python
波兰品牌内衣及泳装网上商店:Astratex.pl
2017/02/03 全球购物
.NET里面什么时候需要调用垃圾回收
2015/06/01 面试题
英文自荐信
2013/12/15 职场文书
建筑结构施工专业推荐信
2014/02/21 职场文书
新员工试用期自我鉴定
2014/04/17 职场文书
作文评语大全
2014/04/23 职场文书
团支书竞选演讲稿
2014/04/28 职场文书
GitHub上77.9K的Axios项目有哪些值得借鉴的地方详析
2021/06/15 Javascript
Go结合Gin导出Mysql数据到Excel表格
2022/08/05 Golang