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 cookie解码函数(兼容ff)
Mar 17 Javascript
jquery获取input表单值的代码
Apr 19 Javascript
javascript 二分法(数组array)
Apr 24 Javascript
Jquery多选下拉列表插件jquery multiselect功能介绍及使用
May 24 Javascript
jQuery实现图片放大预览实现原理及代码
Sep 12 Javascript
上传图片预览JS脚本 Input file图片预览的实现示例
Oct 23 Javascript
JS命令模式例子之菜单程序
Oct 10 Javascript
Jquery给当前页或者跳转后页面的导航栏添加选中后样式的实例
Dec 08 Javascript
vue 实现 tomato timer(蕃茄钟)实例讲解
Jul 24 Javascript
JavaScript实现移动端页面按手机屏幕分辨率自动缩放的最强代码
Aug 18 Javascript
JS中数组与对象的遍历方法实例小结
Aug 14 Javascript
JavaScript获取某一天所在的星期
Sep 05 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
精致的人儿就要挑杯子喝咖啡
2021/03/03 冲泡冲煮
Thinkphp5+uploadify实现的文件上传功能示例
2018/05/26 PHP
JavaScript 页面编码与浏览器类型判断代码
2010/06/03 Javascript
javascript 获取所有id中包含某关键字的控件的实现代码
2010/11/25 Javascript
js字符串转成JSON
2013/11/07 Javascript
jQuery动态添加、删除元素的方法
2014/01/09 Javascript
jquery查找父元素、子元素(个人经验总结)
2014/04/09 Javascript
[原创]推荐10款最热门jQuery UI框架
2014/08/19 Javascript
测试IE浏览器对JavaScript的AngularJS的兼容性
2015/06/19 Javascript
用户管理的设计_jquery的ajax实现二级联动效果
2017/07/13 jQuery
基于Vue 2.0的模块化前端 UI 组件库小结
2017/12/21 Javascript
微信小程序自定义键盘 内部虚拟支付
2018/12/20 Javascript
Vue函数式组件-你值得拥有
2019/05/09 Javascript
微信小程序之数据绑定原理解析
2019/08/14 Javascript
Moment.js实现多个同时倒计时
2019/08/26 Javascript
vue自动化路由的实现代码
2019/09/30 Javascript
jQuery实现朋友圈查看图片
2020/09/11 jQuery
vue 通过 Prop 向子组件传递数据的实现方法
2020/10/30 Javascript
js加减乘除精确运算方法实例代码
2021/01/17 Javascript
[01:08:33]OG vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
python端口扫描系统实现方法
2014/11/19 Python
使用Python脚本来控制Windows Azure的简单教程
2015/04/16 Python
Python使用filetype精确判断文件类型
2017/07/02 Python
python实现扫雷游戏
2020/03/03 Python
python 输入字符串生成所有有效的IP地址(LeetCode 93号题)
2020/10/15 Python
利用CSS3实现的文字定时向上滚动
2016/08/29 HTML / CSS
英国蛋糕装饰用品一站式商店:Craft Company
2019/03/18 全球购物
Java文件和目录(IO)操作
2014/08/26 面试题
中专毕业生自我鉴定
2014/02/02 职场文书
2014年个人债务授权委托书范本
2014/09/22 职场文书
党的群众路线领导班子整改方案
2014/09/27 职场文书
党支部季度考核意见
2015/06/02 职场文书
如何写好开幕词?
2019/06/24 职场文书
2019年员工旷工保证书!
2019/06/28 职场文书
教你使用一行Python代码玩遍童年的小游戏
2021/08/23 Python
Win11 Beta 22621.601 和 22622.601今日发布 KB5017384修复内容汇总
2022/09/23 数码科技