Secret of the JavaScript Ninja 学习笔记 - 5

第四章 Wielding functions

4.1 Anonymous functions

下面的代码演示了采用匿名函数的几个典型场景
    /**
     * Establish an anonymous function as event handler. There's no
     * need to create a named function only to reference it in
     * this location
     */
    window.onload = function() {};
    
    /**
     * Creates a function to be used as a method for ninja. We'll
     * be using the property named shot to invoke the function, so 
     * it doesn't need its own name
     */
    var ninja = {
      shout: function() {
      }
    };
    
    /**
     * Passes a function to the setTimeout() function as a callback
     * to be invoked when the timer expires. Again, why bother to 
     * give it an unneeded name?
     */
    setTimeout(function() {});

4.2 Recursion

4.2.1 Recursion in named functions

    /**
     * Declares a recursive chirping function that calls itself by name 
     * until it determines that it's done.
     */
    function chirp(n) {
      return n > 1 ? chirp(n-1) + "-chirp" : "chirp";
    }
    
    chirp(3);

4.2.2 Recursion with methods

    /**
     * Declares a recursive chirp function as a property of
     * the ninja object. We now need to call the method from
     * within itself using the reference to the object's method
     */
    var ninja = {
      chirp: function(n) {
        return n > 1 ? ninja.chirp(n-1) + "-chirp" : "chirp";
      }
    };
    
    ninja.chirp(3);

4.2.3 The pilfered reference problem

The last example relied on the fact that we had a reference to the function to be called recursively in the property of an object. But unlike a function's actual name, such reference may be transient, and relying upon them can trip us up in confounding ways.
    var ninja = {
      chirp: function(n) {
        return n > 1 ? ninja.chirp(n-1) + "-chirp" : "chirp";
      }
    };
    
    var samurai = { chirp: ninja.chirp };
    
    ninja = {};
    
    samurai.chirp();

4.2.4 Inline named functions

There's nothing wrong with giving any function literal a name, even those that are declared as callbacks or methods. These functions are called inline functions.
    var ninja = {
      chirp: function signal(n) {
        return n > 1 ? signal(n-1) + "-chirp" : "chirp";
      }
    };
    
    var samurai = { chirp: ninja.chirp };
    
    ninja = {};
    
    samurai.chirp();
Even though inline functions can be named, those names are only visible within the functions themselves. It act somewhat like variable names, and their scope is limited to the function within which they're declared.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值