js-arguments和预解析

arguments

*【arguments是个类似数组但不是数组的对象,说他类似数组是因为其具备数组相同的访问性质及方式,能够由arguments[n]
来访问对应的单个参数的值,并拥有数组长度属性length。还有就是arguments对象存储的是实际 传递给函数的参数,而不
局限于函数声明所定义的参数列表,而且不能显式创建 arguments 对象。】

 1 function test() {
 2 var s = "";
 3 for (var i = 0; i < arguments.length; i++) {
 4 alert(arguments[i]);
 5 s += arguments[i] + ",";
 6 }
 7 return s;
 8 }
 9 test("name", "age");
10 
11 输出结果:
12 name,age

*callee 属性是 arguments 对象的一个成员,仅当相关函数正在执行时才可用。callee 属性的初始值就是正被执行的**
Function** 对象。实现匿名的递归函数。(调用自身)

var sum = function (n) {
if (1 == n) {
return 1;
} else {
return n + arguments.callee(n - 1); //6 5 4 3 2 1
}
}
alert(sum(6));

输出结果:21


预解析

【JS代码在执行之前,会对代码进行预解析,寻找作用域中的var 和function ,然后对其进行事先声明,在从上到下执行代码】
1。先读取有var 的变量(没有使用var的变量是不会被预解析的),给赋值为:undefined。如果两个变量重名,并不影响预解析的过程,就写一个变量就行,因为都将变量赋值为undefined(在逐行读取时,只是不同的赋值而已。),如果有函数名和变量重名,那就直接去掉变量,不进行解析。如果函数中存在参数,那么参数也一样使用var进行解析。如:var argument=undefined;

2。再读取function后面的函数---fn,如果有多个函数名重复,那么取最后面一个函数进行声明。

上面实例有两个作用域,一个是window变量对象的全局作用域,一个是fn变量对象的局部作用域。

猜你喜欢

转载自www.cnblogs.com/lp-web/p/12174524.html