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 相关文章推荐
浏览器脚本兼容 文本框中,回车键触发事件的兼容
Jun 21 Javascript
使用滤镜设置透明导致 IE 6/7/8/9 解析异常的解决方法
Apr 07 Javascript
按下Enter焦点移至下一个控件的实现js代码
Dec 11 Javascript
jquery checkbox 勾选的bug问题解决方案与分析
Nov 13 Javascript
JS中用三种方式实现导航菜单中的二级下拉菜单
Oct 31 Javascript
js时间控件只显示年月
Jan 08 Javascript
PHP自动加载autoload和命名空间的应用小结
Dec 01 Javascript
VUE 实现滚动监听 导航栏置顶的方法
Sep 11 Javascript
vue+VeeValidate 校验范围实例详解(部分校验,全部校验)
Oct 19 Javascript
vue tab切换,解决echartst图表宽度只有100px的问题
Jul 19 Javascript
详解JavaScript自定义函数
Jul 29 Javascript
JS前端可扩展的低代码UI框架Sunmao使用详解
Jul 23 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实现的随机广告显示代码
2007/06/14 PHP
PHP MVC模式在网站架构中的实现分析
2010/03/04 PHP
php selectradio和checkbox默认选择的实现方法详解
2013/06/29 PHP
php define的第二个参数使用方法
2013/11/04 PHP
PHP读取文件内容后清空文件示例代码
2014/03/18 PHP
经典的带阴影的可拖动的浮动层
2006/06/26 Javascript
轻轻松松学习JavaScript
2007/02/25 Javascript
jQuery EasyUI API 中文文档 - Documentation 文档
2011/09/29 Javascript
解析JavaScript中delete操作符不能删除的对象
2013/12/03 Javascript
原生Ajax 和jQuery Ajax的区别示例分析
2014/12/17 Javascript
js控制div弹出层实现方法
2015/05/11 Javascript
简介可以自动完成UI的AngularJS工具angular-smarty
2015/06/23 Javascript
优化RequireJS项目的相关技巧总结
2015/07/01 Javascript
网页中JS函数自动执行常用三种方法
2016/03/30 Javascript
用jquery获取自定义的标签属性的值简单实例
2016/09/17 Javascript
js+css3制作时钟特效
2016/10/16 Javascript
JS定时器用法分析【时钟与菜单中的应用】
2016/12/21 Javascript
Javascript实现一个简单的输入关键字添加标签效果实例
2017/06/01 Javascript
BootStrap中Table隐藏后显示问题的实现代码
2017/08/31 Javascript
Vue自定义toast组件的实例代码
2018/08/15 Javascript
JavaScript简单实现动态改变HTML内容的方法示例
2018/12/25 Javascript
JS使用Dijkstra算法求解最短路径
2019/01/17 Javascript
Vue学习之axios的使用方法实例分析
2020/01/06 Javascript
关于python的list相关知识(推荐)
2017/08/30 Python
Python实现二叉树前序、中序、后序及层次遍历示例代码
2019/05/18 Python
django xadmin action兼容自定义model权限教程
2020/03/30 Python
python 使用建议与技巧分享(四)
2020/08/18 Python
Python根据URL地址下载文件并保存至对应目录的实现
2020/11/15 Python
网页布局中CSS样式无效的十个重要原因详解
2017/08/10 HTML / CSS
iframe跨域的几种常用方法
2019/11/11 HTML / CSS
新秀丽官方旗舰店:Samsonite拉杆箱、双肩包、皮具
2018/03/05 全球购物
法人授权委托书
2014/04/03 职场文书
上课迟到检讨书300字
2014/10/15 职场文书
读《方与圆》有感:交友方圆有度
2020/01/14 职场文书
MySQL 5.7常见数据类型
2021/07/15 MySQL
Spring Boot DevTools 全局配置学习指南
2022/03/31 Java/Android