今天我们接着上篇文章来继续javascript函数这个主题。今天要讲的是函数对像中一个很重要的属性--arguments。
相关阅读:
arguments对象参数数组引用
arguments是函数对象内部一个比较特殊的类数组对象,这个对象中包含了所属函数的参数列表,同时还包含一个指向函数原型对象的指针.
我 们先来讨论下arguments中的参数数组,我们可以直接使用[index]的类似访问数组的方式来访问参数。要真正理解这特性,我们先要知道 javascript的函数不关心你传递的参数,因为在调用函数的时候,在函数内部他接收的是一个参数数组,也就是说,理论上,我们可以在声明函数的时候 可以不声明任何参数,但是在调用的时候却可以传递任意多的参数。
如下代码示例:
function sayHi(){ var name = arguments[0]||"default name", greeting = arguments[1]||" how are you"; console.log("Hello "+name+","+ greeting); } //不传参数调用 sayHi(); //传一个参数调用 sayHi("John"); //传两个参数调用 sayHi("John","你好!");
执行结果:
接下来我们在看另外一段代码,来探索arguments对象与参数列表的引用关系。
function dosum(op1,op2){ arguments[1] = 20; console.log(arguments[0]+op2); } dosum(1,1);
我们先预测下执行结果,2还是21?
真正的执行结果如下:
针对上面的执行结果我们可以抽象下argument与参数数组间的引用管理模型。
arguments callee属性
arguments callee属性是一个指向函数对象的指针,灵活使用该属性可以大大降低代码与函数名的耦合度,同时可以使代码更加灵活。
降低耦合度一般在递归运算中体现比较明显。
如下代码:
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没有关系了,就算之后做如下操作,我们依旧可以得到正确的结果。
var afunc = factorial;
factorial = null;
afunc(3); // 同样可以正确返回6
通过arguments.callee的另外一个比较灵活的应用如下:
var otherfunc = (function(){ console.log("do something cool"); return arguments.callee; })();
上面代码所做的操作时立即执行了一个函数,并返回该匿名函数的引用,赋值给otherfunc,这时我们就可以在其他地方继续调用这个函数。
这样的用法是我在项目中遇到的,页面初始化时要做一些操作,也就是页面加载完成后立即执行该函数,但是这个函数并不是一次性的,我们还需要在该页面的其他时候来调用这个函数,上面的代码,个人会比先声明一个函数,然后在页面加载完成后调用要优雅一些,见仁见智罢了。
相关推荐
【JavaScript函数详解】 JavaScript函数是编程中不可或缺的部分,它们是一段可重复使用的代码,能够实现特定功能。函数分为用户自定义函数和系统函数。系统函数是JavaScript内置的,可以直接使用,而自定义函数则由...
JavaScript中的`arguments`对象是一个非常重要的特性,尤其在处理不确定数量的函数参数时。它不是一个真正的数组,但具有数组类似的行为,允许我们访问函数调用时传入的所有参数。在这个文档中,我们将深入探讨`...
JavaScript中的内置对象arguments是一个特别的对象,它是一个类数组对象,存在于所有JavaScript函数中。它主要用来存储传递给函数的参数,这些参数被称为函数的“实参”。虽然arguments对象包含了传递给函数的所有...
JavaScript函数柯里化是一种编程技巧,它源自于数学家哈斯凯尔·加里(Haskell Curry)的名字,因此称为“柯里化”。这种技术的主要目的是将一个多参数的函数转化为一系列单参数的函数,使得每次调用只处理一个参数,...
JavaScript中的箭头函数和普通函数在使用上有显著的差异,这些差异主要体现在以下几个方面: 1. **函数定义的简洁性**: - 箭头函数的语法更紧凑,可以视为匿名函数的一种简写形式。如果函数体只包含一个表达式,...
JavaScript函数详解涉及的知识点众多,首先,我们了解在传统编程语言中,函数往往局限于作为程序的子程序,需要通过特定关键字定义和调用。而在JavaScript中,函数则被视为一等公民(first-class citizens),这意味...
JavaScript中的call、apply和bind方法都是用来改变函数调用时的上下文(即this值)以及传递参数。它们之间的相同点在于,都能够指定函数执行时的this对象,并且都能接收参数。不同点在于它们的调用方式和执行时机。 ...
JavaScript函数是编程语言中的核心概念,它是一段可重复执行的代码,用于实现特定功能。在JavaScript中,函数是第一类对象,这意味着它们可以作为变量存储、作为参数传递给其他函数,甚至可以作为其他函数的返回值。...
即使没有传入参数,函数仍然可以被调用,此时`arguments`对象可用于访问传入的参数。例如: ```javascript function demo() { alert(arguments.length); } demo("hello", 123, true); // 弹出对话框显示参数个数:3...
JavaScript中的函数有两种主要类型:普通函数(也称为传统函数或函数表达式)和箭头函数。这两种函数在语法和行为上都有所不同,对于理解和编写JavaScript代码至关重要。 ### 普通函数 #### 1. 定义 普通函数通过`...
### JavaScript 严格模式详解 #### 引言 在JavaScript中,**严格模式**(strict mode)是ECMAScript 5引入的一种新特性,旨在改善语言的一些不足,提高代码质量和安全性,以及为未来的JavaScript版本铺平道路。...
JavaScript中定义和使用自定义函数是该语言核心功能之一。自定义函数允许开发者封装逻辑,使其可复用且易于维护。以下是一些关键知识点。 一、定义方法 在JavaScript中,自定义函数通过使用function关键字定义。...
arguments是函数调用时,创建的一个类似的数组但又不是数组的对象,并且它存储的是实际传递给函数的参数,并不局限于函数声明的参数列表哦。 尼玛,什么意思? 写个demo看看,代码见下 <!DOCTYPE html> <...
### JavaScript中的`arguments`对象详解 在JavaScript编程中,`arguments`对象是一个非常有用的特性,尤其是在处理函数调用时不确定参数数量的情况下。虽然它不是ECMAScript标准的一部分,但所有主流浏览器都支持这...
在JavaScript编程中,arguments对象是一个非常有用的概念,尤其是在处理函数参数方面。在许多编程语言中,如PHP,函数参数可以设置默认值,这样当调用函数时,如果缺少参数,就会自动使用预设的默认值。但在...
在JavaScript中实现继承有多种方法,其中构造函数和原型链的方式是较为传统的一种,但在实际应用中存在一些问题和陷阱。本章节将深入分析这些常见的问题,并提出相应的解决方案。 首先,我们回顾一下使用构造函数和...
JavaScript中的`arguments.callee`是一个在函数内部引用当前正在执行的函数对象的属性。这个属性在函数递归、保持函数封装性以及匿名函数自我引用等场景中尤其有用。然而,由于`arguments`对象是一个相对昂贵的操作...
- "no-dupe-args": 2 - 函数参数不能重复 - "no-duplicate-case": 2 - `switch` 中的 `case` 标签不能重复 这些规则可以帮助你保持代码的一致性和可读性。通过自定义 `.eslintrc.js` 文件,你可以根据团队的需求...