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实现页面滚动图片加载(仿lazyload效果)
Jul 22 Javascript
JQuery入门—JQuery程序的代码风格详细介绍
Jan 03 Javascript
javascript中常用编程知识
Apr 08 Javascript
利用javascript判断文件是否存在
Dec 31 Javascript
jquery操作对象数组元素方法详解
Nov 26 Javascript
JavaScript知识点总结(五)之Javascript中两个等于号(==)和三个等于号(===)的区别
May 31 Javascript
关于JS变量和作用域详解
Jul 28 Javascript
ES6中Symbol类型用法实例详解
Apr 06 Javascript
如何在 Vue.js 中使用第三方js库
Apr 25 Javascript
jQuery实现的鼠标响应缓冲动画效果示例
Feb 13 jQuery
Vue项目中设置背景图片方法
Feb 21 Javascript
用JS创建一个录屏功能
Nov 11 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中使用sockets:从新闻组中获取文章
2006/10/09 PHP
建立动态的WML站点(三)
2006/10/09 PHP
php中对2个数组相加的函数
2011/06/24 PHP
Linux下创建nginx脚本-start、stop、reload…
2014/08/03 PHP
js 动态添加标签(新增一行,其实很简单,就是几个函数的应用)
2009/03/26 Javascript
jqPlot 基于jquery的画图插件
2011/04/26 Javascript
javascript入门教程基础篇
2015/11/16 Javascript
JavaScript导航脚本判断当前导航
2016/07/12 Javascript
JavaScript中的对象继承关系
2016/08/01 Javascript
微信小程序 配置文件详细介绍
2016/12/14 Javascript
jQuery拖拽通过八个点改变div大小
2020/11/29 Javascript
Vue.js系列之项目搭建(1)
2017/01/03 Javascript
Angular.js 4.x中表单Template-Driven Forms详解
2017/04/25 Javascript
详解Angular的8个主要构造块
2017/06/20 Javascript
node.js操作MongoDB的实例详解
2017/10/11 Javascript
vue使用video.js进行视频播放功能
2019/07/18 Javascript
[03:44]2014DOTA2国际邀请赛 71专访:DK战队赛前讨论视频遭泄露
2014/07/13 DOTA
详解Django中的form库的使用
2015/07/18 Python
Python3实现发送QQ邮件功能(附件)
2020/12/23 Python
Python键盘输入转换为列表的实例
2018/06/23 Python
django的auth认证,authenticate和装饰器功能详解
2019/07/25 Python
python实现梯度法 python最速下降法
2020/03/24 Python
执行Python程序时模块报错问题
2020/03/26 Python
Python 程序报错崩溃后如何倒回到崩溃的位置(推荐)
2020/06/23 Python
重新定义牛仔布,100美元以下:Warp + Weft
2018/07/25 全球购物
Hanro官网:奢华男士和女士内衣、睡衣和家居服
2018/10/25 全球购物
西班牙购买隐形眼镜、眼镜和太阳镜网站:Lentiamo.es
2020/06/11 全球购物
小小的船教学反思
2014/02/21 职场文书
绿色环保标语
2014/06/12 职场文书
2014年乡镇卫生院工作总结
2014/11/24 职场文书
建党伟业观后感
2015/06/01 职场文书
小学教师读书笔记
2015/07/01 职场文书
领导干部学习十八届五中全会精神心得体会
2016/01/05 职场文书
MySQL系列之五 视图、存储函数、存储过程、触发器
2021/07/02 MySQL
Java实现聊天机器人完善版
2021/07/04 Java/Android
mysql 获取相邻数据项
2022/05/11 MySQL