zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Codeforces 1291 Round #616 (Div. 2) B
    总结
    刷新DNS解析缓存+追踪+域名解析命令
    数学--数论--Hdu 5793 A Boring Question (打表+逆元)
    Lucene.net(4.8.0) 学习问题记录六:Lucene 的索引系统和搜索过程分析
    LeetCode 117 Populating Next Right Pointers in Each Node II
    LeetCode 116 Populating Next Right Pointers in Each Node
    test test
    LeetCode 115 Distinct Subsequences
    LeetCode 114. Flatten Binary Tree to Linked List
  • 原文地址:https://www.cnblogs.com/qxp140605/p/11586097.html
Copyright © 2011-2022 走看看