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+css使DIV始终居于屏幕中间 左下 左上 右上 右下的代码集合
Mar 10 Javascript
jQuery基本选择器选择元素使用介绍
Apr 18 Javascript
jquery ajax 局部刷新小案例
Feb 08 Javascript
使用jquery实现仿百度自动补全特效
Jul 23 Javascript
JS实现title标题栏文字不间断滚动显示效果
Sep 07 Javascript
Bootstrap对话框使用实例讲解
Sep 24 Javascript
给easyui datebox扩展一个清空的实例
Nov 09 Javascript
javascript 面向对象function详解及实例代码
Feb 28 Javascript
w3c编程挑战_初级脚本算法实战篇
Jun 23 Javascript
使用Vue如何写一个双向数据绑定(面试常见)
Apr 20 Javascript
jQuery AJAX与jQuery事件的分析讲解
Feb 18 jQuery
js实现拖动缓动效果
Jan 13 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
Terran建筑一览
2020/03/14 星际争霸
php 使用GD库为页面增加水印示例代码
2014/03/24 PHP
Yii2 输出xml格式数据的方法
2016/05/03 PHP
解决php扩展安装不生效问题
2019/10/25 PHP
jQuery 工具函数学习资料
2010/04/29 Javascript
js获取元素在浏览器中的绝对位置
2010/07/24 Javascript
解析John Resig Simple JavaScript Inheritance代码
2012/12/03 Javascript
js单词形式的运算符
2014/05/06 Javascript
JQuery中使文本框获得焦点的方法实例分析
2015/02/28 Javascript
jqGrid表格应用之新增与删除数据附源码下载
2015/12/02 Javascript
bootstrap导航条实现代码
2016/12/28 Javascript
简单实现js选项卡切换效果
2017/02/09 Javascript
jQuery的中 is(':visible') 解析及用法(必看)
2017/02/12 Javascript
jQuery实现选项卡功能(两种方法)
2017/03/08 Javascript
layui选项卡效果实现代码
2017/05/19 Javascript
angularjs中ng-bind-html的用法总结
2017/05/23 Javascript
JavaScript实现三级联动效果
2017/07/15 Javascript
VeeValidate在vue项目里表单校验应用案例
2018/05/09 Javascript
vue+Vue Router多级侧导航切换路由(页面)的实现代码
2018/12/20 Javascript
[01:01:42]Secret vs Optic Supermajor 胜者组 BO3 第二场 6.4
2018/06/05 DOTA
[01:10:24]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第一场 2月28日
2021/03/11 DOTA
Python中urllib+urllib2+cookielib模块编写爬虫实战
2016/01/20 Python
Python 实现交换矩阵的行示例
2019/06/26 Python
python实现信号时域统计特征提取代码
2020/02/26 Python
Python做图像处理及视频音频文件分离和合成功能
2020/11/24 Python
深入开展党的群众路线教育实践活动方案
2014/02/04 职场文书
2014年服务行业工作总结
2014/11/18 职场文书
2014年应急工作总结
2014/12/11 职场文书
赔偿协议书怎么写
2015/01/28 职场文书
酒店圣诞节活动总结
2015/05/06 职场文书
表彰大会新闻稿
2015/07/17 职场文书
《圆的周长》教学反思
2016/02/17 职场文书
助学金申请书该怎么写?
2019/07/16 职场文书
python内置进制转换函数的操作
2021/06/02 Python
Python实现PIL图像处理库绘制国际象棋棋盘
2021/07/16 Python
Python音乐爬虫完美绕过反爬
2021/08/30 Python