zoukankan      html  css  js  c++  java
  • javascript高级知识分析——函数访问

    代码信息来自于http://ejohn.org/apps/learn/。

    可以通过函数的名字在它的内部引用它。

    function yell(n){ 
      return n > 0 ? yell(n-1) + "a" : "hiy"; 
    } 
    console.log( yell(4) === "hiyaaaa", "在函数的内部通过它的名字访问它自己" );

    当不通过命名函数来声明时,在其内部如何调用自己?

    var ninja = { 
      yell: function(n){ 
        return n > 0 ? arguments.callee(n-1) + "a" : "hiy"; 
      } 
    }; 
    console.log( ninja.yell(4) == "hiyaaaa", "arguments.callee 指的是函数自己" );

    函数的名字作用域失效。

    var ninja = function myNinja(){ 
      console.log( ninja === myNinja, "这个函数的引用和名字是同一个函数" ); 
    }; 
    ninja(); 
    console.log( typeof myNinja === "undefined", "但在函数外面不可以访问" ); 
    console.log( ninja );//function myNinja()

    注意,当我们使用命名函数声明再分配给一个变量时,这个函数的名字在内部可以引用,外部却不可以。而分配的变量都可以引用。

    当匿名函数为一个对象的属性时,也可以调用它。

    var ninja = { 
      yell: function(n){ 
        return n > 0 ? ninja.yell(n-1) + "a" : "hiy"; 
      } 
    }; 
    console.log( ninja.yell(4) === "hiyaaaa");//true

    通过这个对象的属性,我们可以调用它。

    当移除原对象时,会发生什么情况?

    var ninja = { 
      yell: function(n){ 
        return n > 0 ? ninja.yell(n-1) + "a" : "hiy"; 
      } 
    }; 
    console.log( ninja.yell(4) == "hiyaaaa"); //true
     
    var samurai = { yell: ninja.yell }; 
    var ninja = null; 
     
    try { 
      samurai.yell(4); 
    } catch(e){ 
      console.log( "不可以访问啦" ); 
    }

    同样的情况,但当我们给匿名函数一个名字时又会?

    var ninja = { 
      yell: function yell(n){ 
        return n > 0 ? yell(n-1) + "a" : "hiy"; 
      } 
    }; 
    console.log( ninja.yell(4) == "hiyaaaa"); 
     
    var samurai = { yell: ninja.yell }; 
    var ninja = null; 
    console.log( samurai.yell(4) == "hiyaaaa", "注意,它仍然可以调用这个函数" );
  • 相关阅读:
    155. 最小栈
    160. 相交链表
    PAT 1057 Stack
    PAT 1026 Table Tennis
    PAT 1017 Queueing at Bank
    PAT 1014 Waiting in Line
    PAT 1029 Median
    PAT 1016 Phone Bills
    PAT 1010 Radix
    PAT 1122 Hamiltonian Cycle
  • 原文地址:https://www.cnblogs.com/winderby/p/4063279.html
Copyright © 2011-2022 走看看