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 相关文章推荐
js动态设置div的值下例子
Oct 29 Javascript
JavaScript中使用Object.create()创建对象介绍
Dec 30 Javascript
使用jquery+CSS实现控制打印样式
Dec 31 Javascript
使用ngView配合AngularJS应用实现动画效果的方法
Jun 19 Javascript
理解javascript闭包
Dec 15 Javascript
如何在AngularJs中调用第三方插件库
May 21 Javascript
AngularJS学习笔记之表单验证功能实例详解
Jul 06 Javascript
在layui中select更改后生效的方法
Sep 05 Javascript
JS实现电商商品展示放大镜特效
Jan 07 Javascript
jQuery实现动态加载瀑布流
Sep 01 jQuery
jQuery实现图片切换效果
Oct 19 jQuery
详解jQuery的核心函数和事件处理
Feb 18 jQuery
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
新52大事件
2020/03/03 欧美动漫
php 安全过滤函数代码
2011/05/07 PHP
php连接oracle数据库及查询数据的方法
2014/12/29 PHP
YII动态模型(动态表名)支持分析
2016/03/29 PHP
详解php伪造Referer请求反盗链资源
2019/01/24 PHP
Jquery 扩展方法
2010/05/06 Javascript
基于bootstrap插件实现autocomplete自动完成表单
2016/05/07 Javascript
AngularJS基础 ng-readonly 指令简单示例
2016/08/02 Javascript
AngularJS实现的select二级联动下拉菜单功能示例
2017/10/25 Javascript
Node.JS段点续传:Nginx配置文件分段下载功能的实现方法
2018/03/12 Javascript
通过jquery获取上传文件名称、类型和大小的实现代码
2018/04/19 jQuery
vue中的自定义分页插件组件的示例
2018/08/18 Javascript
在vue中实现点击选择框阻止弹出层消失的方法
2018/09/15 Javascript
Async/Await替代Promise的6个理由
2019/06/15 Javascript
vue 使用微信jssdk,调用微信相册上传图片功能
2020/11/13 Javascript
[04:09]2014DOTA2国际邀请赛Ti西雅图 历届冠军相继出局 BBC综述今日比赛
2014/07/20 DOTA
[52:10]LGD vs Optic Supermajor小组赛D组胜者组决赛 BO3 第二场 6.3
2018/06/04 DOTA
详解python的数字类型变量与其方法
2016/11/20 Python
python2.7 mayavi 安装图文教程(推荐)
2017/06/22 Python
python函数中return后的语句一定不会执行吗?
2017/07/06 Python
Python代码实现KNN算法
2017/12/20 Python
python+tkinter编写电脑桌面放大镜程序实例代码
2018/01/16 Python
在PyCharm环境中使用Jupyter Notebook的两种方法总结
2018/05/24 Python
Python JSON格式数据的提取和保存的实现
2019/03/22 Python
python写文件时覆盖原来的实例方法
2020/07/22 Python
使用canvas生成含有微信头像的邀请海报没有微信头像问题
2019/10/29 HTML / CSS
KIEHL’S科颜氏官方旗舰店:源自美国的顶级护肤品牌
2018/06/07 全球购物
中国一家综合的外贸B2C电子商务网站:DealeXtreme(DX)
2020/03/10 全球购物
高二地理教学反思
2014/01/24 职场文书
8和9的加减法教学反思
2014/05/01 职场文书
法学求职信
2014/06/22 职场文书
2015年安全员工作总结范文
2015/04/22 职场文书
运动会表扬稿范文
2015/05/05 职场文书
学生病假条范文
2015/08/17 职场文书
Ajax实现三级联动效果
2021/10/05 Javascript
Python万能模板案例之matplotlib绘制直方图的基本配置
2022/04/13 Python