函数内部属性之arguments和this
程序员文章站
2022-05-26 14:57:40
在函数内部,有两个特殊的对象:arguments和this。 1、arguments arguments是一个类数组对象。包含着传入函数中的所有参数。但这个对象还有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。 经典案例:阶乘函数 定义阶乘函数一般都要用到递 ......
在函数内部,有两个特殊的对象: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”。
函数的名字仅仅是一个包含指针的变量。
推荐阅读
-
JavaScript基础之this和箭头函数详析
-
C++入门之new和delete关键字、静态成员属性与函数、this指针使用介绍
-
C++学习笔记之调用构造函数和析构函数的顺序
-
PHP 5.0对象模型深度探索之属性和方法
-
Vue之render渲染函数和JSX的应用
-
C语言时间函数之mktime和difftime详解
-
php数组函数序列之end() - 移动数组内部指针到最后一个元素,并返回该元素的值
-
php数组函数序列之each() - 获取数组当前内部指针所指向元素的键名和键值,并将指针移到下一位
-
php数组函数序列之prev() - 移动数组内部指针到上一个元素的位置,并返回该元素值
-
Excel VBA之控制工作表显示和隐藏的Visible属性实例学习及参数解析