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 相关文章推荐
jQuery温习篇 强大的JQuery选择器
Apr 24 Javascript
Javascript selection的兼容性写法介绍
Dec 20 Javascript
编写高效jQuery代码的4个原则和5个技巧
Apr 24 Javascript
一个简单的实现下拉框多选的插件可移植性比较好
May 05 Javascript
浅谈JavaScript字符集
May 22 Javascript
jquery采用oop模式class类的使用示例
Jan 22 Javascript
jQuery-mobile事件监听与用法详解
Nov 23 Javascript
React-Native中禁用Navigator手势返回的示例代码
Sep 09 Javascript
对Vue2 自定义全局指令Vue.directive和指令的生命周期介绍
Aug 30 Javascript
Vue Prop属性功能与用法实例详解
Feb 23 Javascript
ElementUI radio组件选中小改造
Aug 12 Javascript
vuex中遇到的坑,vuex数据改变,组件中页面不渲染操作
Nov 16 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
优化NFR之一 --MSSQL Hello Buffer Overflow
2006/10/09 PHP
PHP strtr() 函数使用说明
2008/11/21 PHP
解析php做推送服务端实现ios消息推送
2013/07/01 PHP
thinkPHP框架中执行原生SQL语句的方法
2017/10/25 PHP
PHP开发API接口签名生成及验证操作示例
2020/05/27 PHP
Aster vs Newbee BO5 第一场2.19
2021/03/10 DOTA
javascript 页面划词搜索JS
2009/09/28 Javascript
javascript 数字格式化输出的实现代码
2013/12/10 Javascript
jQuery $.extend()用法总结
2014/06/15 Javascript
jQuery实现的导航条切换可显示隐藏
2014/10/22 Javascript
Jquery组件easyUi实现手风琴(折叠面板)示例
2016/08/23 Javascript
快速解决js中window.location.href不工作的问题
2016/11/02 Javascript
vue mixins组件复用的几种方式(小结)
2017/09/06 Javascript
vue2 router 动态传参,多个参数的实例
2017/11/10 Javascript
Vue中的异步组件函数实现代码
2018/07/20 Javascript
python用10行代码实现对黄色图片的检测功能
2015/08/10 Python
对python中数据集划分函数StratifiedShuffleSplit的使用详解
2018/12/11 Python
Python高斯消除矩阵
2019/01/02 Python
pytorch之inception_v3的实现案例
2020/01/06 Python
VSCode基础使用与VSCode调试python程序入门的图文教程
2020/03/30 Python
python 制作网站小说下载器
2021/02/20 Python
一文读懂python Scrapy爬虫框架
2021/02/24 Python
美国彩妆品牌:Coastal Scents
2017/04/01 全球购物
爱尔兰灯和灯具网上商店:Lights.ie
2018/03/26 全球购物
Internet主要有哪些网络群组成
2015/12/24 面试题
介绍一下Linux文件的记录形式
2013/09/29 面试题
班组长工作职责
2013/12/25 职场文书
万年牢教学反思
2014/02/15 职场文书
乡镇办公室工作决心书
2014/03/11 职场文书
管理提升方案
2014/06/04 职场文书
读群众路线的心得体会
2014/09/03 职场文书
2014年司机工作总结
2014/11/21 职场文书
2014年生产管理工作总结
2014/12/23 职场文书
2015年世界环境日演讲稿
2015/03/18 职场文书
导游词之井冈山
2019/11/20 职场文书
Java版 简易五子棋小游戏
2022/05/04 Java/Android