在讲解 arguments 之前,我们先来个小思考,浏览器把变量都存放在哪了?
比如我在某个页面内声明了一个变量 var a = 1;,这个 a 存放在什么地方了呢?不要告诉我说在内存中,这是废话。。。。
文盲的理解是存放在 frames 里。。。。为什么这么说呢?
比如我们直接写一个页面 a.html
<html>
<script>
var a = 1;
</script>
</html>
<script>
var a = 1;
</script>
</html>
我们在地址栏输入指令:javascript:alert(window.a);,可以看到会有一个弹出的结果 1;
而在另一个页面中,我们这么写 b.html
<frameset rows="42,*" framespacing=0 border=1 frameborder=0>
<frame name=banner src="a.html" noresize scrolling=no>
<frameset cols="160,*">
<frame name=menu src="a.html" scrolling=auto noresize>
<frame name=main src="a.html" scrolling=auto>
</frameset>
<noframes>
</noframes>
</frameset>
<frame name=banner src="a.html" noresize scrolling=no>
<frameset cols="160,*">
<frame name=menu src="a.html" scrolling=auto noresize>
<frame name=main src="a.html" scrolling=auto>
</frameset>
<noframes>
</noframes>
</frameset>
同样,我们在地址栏输入指令 javascript:alert(frames[0].a);,同样可以看到会有一个弹出的结果 1;
那么文盲的感觉就是,在第一个例子中,没有定义框架,那么框架就是 window 本身
而在第二种情况下,每一个 frame 都有单独不同的变量存放结果,你可以任意定义修改各自 frame 中的数据而不会混乱,所以文盲认为,公共变量是存放在 frames 中
同样,我们定义的 function 也存放在该区域内,比如我们就可以在 iframe 中调用 iframe 外的方法 parent.forms[0].submit(); 或者在一个 frame 里调用另一个 frame 里的方法 window.frames[2].document.forms[0].submit();
以上为文盲的胡言乱语,欢迎大家批判
----------------------------------------------------------------------------------------------------------------------
arguments ,根据字面的意思,就可以理解为参数集合,在 JS 中,每定义一个 function 则必定有一个该 function 内部的 arguments
比如我们做一个很简单的函数,取一个随机数:
<script>
function rnd(){
if (arguments.length > 0){
if (arguments[0] * 1 != arguments[0]){
return Math.random();
}else{
return Math.floor(Math.random() * arguments[0]);
}
}else{
return Math.random();
}
}
</script>
function rnd(){
if (arguments.length > 0){
if (arguments[0] * 1 != arguments[0]){
return Math.random();
}else{
return Math.floor(Math.random() * arguments[0]);
}
}else{
return Math.random();
}
}
</script>
在这里, rnd 函数可以有两个使用方式,一是没有任何参数,或第一个参数不是合法的数值型表达式的情况,返回 0 到 1 之间的随机小数,另一个是有参数,且第一个参数为合法的数值表达式,则返回 0 到该表达式值之间的随机整数;
这里就是根据 arguments 集合来判断是否是参数传递进来的
我们可以在页面内定义个测试用的函数,来看一下 arguments 集合的信息
<script>
function testArguments(){
var n = '本次共传递了 ' + arguments.length + ' 个参数;/n/n参数集合为:/n';
for (var i = 0 ; i < arguments.length ; i ++ ){
n += '/n 参数 ' + i + ' 为:' + arguments[i];
}
alert(n);
}
</script>
function testArguments(){
var n = '本次共传递了 ' + arguments.length + ' 个参数;/n/n参数集合为:/n';
for (var i = 0 ; i < arguments.length ; i ++ ){
n += '/n 参数 ' + i + ' 为:' + arguments[i];
}
alert(n);
}
</script>
在地址栏输入指令: javascript:testArguments(1,new Date(),document.body,[1,2,3]); 进行测试
arguments 对于不确定的参数个数的函数定义具有很有效的处理办法
比如文盲在表单校验的时候经常使用的一个小函数
<script>
function checkForm(){
var obj = arguments[0];
for (var i = 1;i <= arguments.length / 2 ; i ++ ){
if ((obj.elements[arguments[i * 2 - 1]].value=='')||isSpace(obj.elements[arguments[i * 2 - 1]].value)){
alert(arguments[i * 2]);
obj.elements[arguments[i * 2 - 1]].focus();
return false;
}
}
return true;
}
</script>
<form οnsubmit="return checkForm(this,'name','姓名不能为空','pwd','密码不能为空');">
姓名:<input type="text" name="name" /> 密码:<input type="password" name="pwd" />
<input type="submit" value="提交" />
</form>
function checkForm(){
var obj = arguments[0];
for (var i = 1;i <= arguments.length / 2 ; i ++ ){
if ((obj.elements[arguments[i * 2 - 1]].value=='')||isSpace(obj.elements[arguments[i * 2 - 1]].value)){
alert(arguments[i * 2]);
obj.elements[arguments[i * 2 - 1]].focus();
return false;
}
}
return true;
}
</script>
<form οnsubmit="return checkForm(this,'name','姓名不能为空','pwd','密码不能为空');">
姓名:<input type="text" name="name" /> 密码:<input type="password" name="pwd" />
<input type="submit" value="提交" />
</form>
isSpace 是一个自定义函数,主要是检测表达式的值是否全是由空格组成的,这样在表单校验的时候,我们就可以直接对 checkForm 添加很多的参数进行校验,而不必再单独为每一个文本输入框去书写校验代码。