JavaScript 神奇的参数

JS函数的参数,和其他语言区别非常大。它不在乎你传过来多少个参数,也不在乎传过来的参数是什么类型。即使你定义的函数只接受两个参数,你调用这个函数的时候可以传递一个、三个甚至不传参数。这是因为JavaScript中的参数在内部是用一个数组来表示的。函数接收到的永远是这个数组,而不关心数组中包含哪些参数(如果有参数的话)。在函数体内我们可以通过arguments对象来访问这个数组来获得传递给函数的每一个参数。可以看下面的例子:

function sayHi(name,message) {
    alert("hello " + name + "," + message);
}
function sayHi() {
    alert("hello " + arguments[0] + "," + arguments[1]);
}

第一段代码是通过命名参数来传值, 第二段代码对第一段代码进行了重写。这个重写后的函数中不包含命名的参数。虽然没有使用name和message标识符,但函数的功能依旧。这个事实说明JavaScript函数的一个重要特点:命名的参数只提供便利,但不是必需的。另外,在命名参数方面,其他语言可能需要事先创建一个函数签名, 而将来的调用必须与该签名一致。但在JavaScript中, 没有这些条条框框,解析器不会验证命名参数。通过访问arguments对象的length属性可以获知有多少个参数传递给了函数。开发人员可以利用这一点让函数能够接收任意个参数并分别实现适当的功能。请看下面的例子:

function doAdd() {
if (arguments.length == 1) {
    alert(arguments[0] + 10);
} else if (arguments.length == 2) {
    alert(arguments[0] + arguments[1]);
}
doAdd(10);    //20
doAdd(30,20);    //50

大家都知道JavaScript中没有重载,而利用上例中的特性就实现一个不太完美的重载,也算是弥补了JS的这一缺陷了。

arguments对象可以与命名参数一起使用,并且arguments的值永远与对应命名参数的值保持同步。如下例所示:

function doAdd (num1, num2) {
    arguments[1] = 10;
    alert(arguments[0] + num2) ;
}

每次执行这个doAdd()函数都会重写第二个参数,将第二个参数的值修改为10。因为arguments对象中的值会自动反映到对应的命名参数,所以修改arguments[1],也就修改了num2,结果它们的值都会变成10。不过,这并不是说读取这两个值会访问相同的内存空间;它们的内存空间是独立的,但它们的值会同步。另外还要记住,如果只传入了一个参数,那么为arguments[1]设置的值不会反映到命名参数中。这是因为arguments对象的长度是由传入的参数个数决定的,不是由定义函数时的命名参数的个数决定的。而且没有传递值的命名参数num2 将自动被赋予undefined值。这就跟定义了变量但又没有初始化一样。

原文地址:https://www.cnblogs.com/weiyalin/p/9441889.html

时间: 2024-11-09 00:42:36

JavaScript 神奇的参数的相关文章

javascript获取url参数代码实例

javascript获取url参数代码实例: 有时候可能需要获取url中的参数值,下面是一段相关的代码实例. 代码如下: var url="www.softwhy.com/test.php?id=21&a=5"; if(url.indexOf("?")!=-1) { var p=url.indexOf("?"); //返回所在位置 var str = url.substr(p+1) //从这个位置开始截取 strs = str.split

kettle转换JavaScript获取命令行参数

日常开发中由于很多参数是变化的,需要在部署时才能确定.而写在配置文件里又显得很笨重,因而可以运行时实时指定.那么kettle是怎么获取命令行中的参数的呢? kettle可以通过转换里的JavaScript获取变量 _step_.getTransMeta().getArguments()[0];

Javascript中关键参数this浅析

自从接触javascript以来,对this参数的理解一直是模棱两可.虽有过深入去理解,但却也总感觉是那种浮于表面,没有完全理清头绪.废话不多,先看一个板栗: var test = function(){}; test.prototype = { foo:"apple", fun:function(){ this.foo="banana"; } }; var myTest = new test(); myTest.fun(); console.log(myTest.

用JavaScript获取URL参数的方法之一

若地址栏URL为:abc.html?m=tomms&c=allsearchlist&pageNo=1&pageNum=20&text=1 1 <script> 2 //JavaScript获取url,并把url中的参数变成数组的方法,arr数组的值就是各参数值 3 var url = window.document.location.href.toString(); 4 var u = url.split("?"); 5 var arr =

JavaScript中函数参数的按值传递与按引用传递(即按地址传递)

首先声明一句:JavaScript中所有函数的参数都是按值传递的!不存在按引用传递! 在讲传递参数之前我们先来讲一下指针. 学过C指针的应该都知道,指针变量中保存的是一个地址,程序可以根据所保存的地址访问内存中对应的值并进行操作,如下图: 其中地址为0x00000016保存的是一个地址,指向地址0x00000036,即0x00000016被开辟为一个指针变量,可以引用0x00000036地址的值,这是按引用方式访问变量:另外一种访问变量的方式是按值访问,即图中0x00000008地址. 在Jav

关于JavaScript函数及其参数

问题由来: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 </head> 7 <body> 8 9 </body> 10 <script type="text/javascript"&

ArcGIS For JavaScript API 默认参数

“esri.config”的是在1.3版中的的“esriConfig”的替代品.如果您使用的是1.2或更低的版本,您应该参阅默认API v1.2和更低的配置.对于版本1.3或更高版本,您可以使用“esri.config”在地方的“esriConfig”.虽然“esriConfig”可以继续使用,与1.3版本,您应该更新您的应用程序,而不是使用“esri.config”.ArcGIS的JavaScript API中有一些默认的配置,可以被重写编程.例如:        var zoomSymbol

Javascript - Jquery - 函数参数

函数参数(Parameter Mapping) 多参数 当一个函数具有多个参数时,如果我们在调用该函数时传递一大堆参数进去,而有些参数并不是必须的,代码看起来就有点混乱,此时可以使用匿名对象来解决.将参数作为匿名对象的属性,然后将匿名对象作为函数的参数即可. 参数替换 函数内部可以定义一个对象,设置对象的属性就是设置函数参数的默认值. function aa(options) { //配置默认参数 var param = { gender: 'man', age: 18 }; //extend方

showModalDialog()向子窗口传自定义参数(javascript提取url参数)及其他

事情是这样子的. 今天下午我正刷果壳刷的不亦乐乎,突然需求就下来了. 它!就!这!么!下!来!了! 客户说,我们需要打开一个新窗口来进行模糊查询,然后选择一个查询结果回填到父窗口中. valy easy. 然后我发现那个模糊查询的页面叫agentSearch.jsp 里面的内容是这样的 function backfill(){     var val = document.getElementById("agentsearch").value;     var parWin = win