js函数

1.arguments对象

 1 在函数代码中,使用特殊对象 arguments,开发者无需明确指出参数名,就能访问它们。
 2 function sayHi() {
 3         console.log(arguments)
 4         if (arguments[0] == "bye") {
 5         return;
 6     }
 7    alert(arguments[0]);
 8 }
 9 sayHi('bye','hi');
10 arguments[0]对应的第一个参数,依次类推arguments[1]对应的第二个参数'hi'11 还可以用 arguments 对象检测函数的参数个数,引用属性rguments.length 即可。

2.Function 对象

 

 1 function doAdd(iNum) {
 2     alert(iNum + 20);
 3 }
 4 function doAdd(iNum) {
 5   alert(iNum + 10);
 6 }
 7 doAdd(10);    //输出 "20
 8 doAdd 的值被改成了指向不同对象的指针。函数名只是指向函数对象的引用值,行为就像其他对象一样。
 9 var doAdd = new Function("iNum", "alert(iNum + 10)");
10 var alsodoAdd = doAdd;
11 doAdd(10);    //输出 "20"
12 alsodoAdd(10);    //输出 "20"
13 两个变量指向同一个函数,变量 doAdd 被定义为函数,然后 alsodoAdd 被声明为指向同一个函数的指针。用这两个变量都可以执行该函数的代码,并输出相同的结果 - "20"。

 

3.闭包

 1 function count() {
 2     var arr = [];
 3     var i = 1;
 4     for (i; i <= 3; i++) {
 5         arr.push(function () {
 6             return i * i;
 7         });
 8     }
 9     console.log(i) //4
10     return arr;
11 }
12 var results = count();
13 var f1 = results[0];
14 var f2 = results[1];
15 var f3 = results[2];
16 console.log(f1()) //16
17 console.log(f2()) //16
18 console.log(f3()) //16
19 返回的函数在其定义内部引用了局部变量arr,所以,当一个函数返回了一个函数后,其内部的局部变量还被新函数引用。返回的函数并没有立刻执行,而是直到调用了f()才执行。在上面的例子中,每次循环,都创建了一个新的函数,然后,把创建的3个函数都添加到一个Array中返回了。你可能认为调用f1(),f2()和f3()结果应该是1,4,9,但实际结果是:全部都是16!原因就在于返回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i已经变成了4,因此最终结果为16。
20 返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
21 如果一定要引用循环变量怎么办?方法是再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变:
22 function count() {
23     var arr = [];
24     var i = 1;
25     for (i; i<=3; i++) {
26         arr.push((function (n) {
27             return function () {
28                 return n * n;
29             }
30         })(i)); //立即执行函数,也就是直接得出结果
31     }
32     console.log(i) //4
33     return arr;
34 }
35 var results = count();
36 var f1 = results[0];
37 var f2 = results[1];
38 var f3 = results[2];
39 console.log(f1()) //1
40 console.log(f2()) //4
41 console.log(f3()) //9
 1 闭包实现计数器:
 2 function create_counter(initial) {
 3     var x = initial || 0;
 4     return {
 5         inc: function () {
 6             x += 1;
 7             return x;
 8         }
 9     }
10 }
11 var c1 = create_counter();
12 c1.inc(); // 1
13 c1.inc(); // 2
14 c1.inc(); // 3

 

posted @ 2019-09-25 17:17  PiPai  阅读(193)  评论(0编辑  收藏  举报