搜尋

首頁  >  問答  >  主體

javascript - 是否應該避免在函數內宣告函數(故意閉包除外)?

$('.dom').on('click', function () {
    function test() {
        console.log('abc');
    } 
});

函數test 在每次點擊的時候被聲明然後click 回調執行完被GC 如果dom 不止被一次點擊那麼每次的點擊回調都多了一步函數聲明我記得在jshint 的規範裡都不允許函數聲明寫到循環裡現在的情況不是類似嗎?那麼如何處理才是最完美的我應該把test 函數聲明位置提到外部嗎那麼這樣又會造成閉包導致test 函數無法被回收的如果用戶只用到一次這塊邏輯的話顯然是虧的到底該如何權衡? ~

迷茫迷茫2796 天前592

全部回覆(3)我來回復

  • 过去多啦不再A梦

    过去多啦不再A梦2017-05-19 10:25:40

    循環裡跟函數裡是不一樣的。

    循環裡並不是一個獨立的作用域,所以在裡面宣告函數會宣告提前,函數裡則不會。 jshint防止的是重複定義。

    function a() {
        function b() {
        }
    }

    b只有在a函數執行的才會被聲明,並且如果沒有任何外部引用指向b,則在函數執行完下一輪回收後被銷毀。

    其實差異不大。

    回覆
    0
  • 世界只因有你

    世界只因有你2017-05-19 10:25:40

    function test(message) {
      console.log(message);
    }
    
    $('.dom').on('click', function () {
      test('abc')
    });

    test 用完就丟了,並不會無法回收。

    回覆
    0
  • 为情所困

    为情所困2017-05-19 10:25:40

    如果只執行一次的話, 可以這樣:

    var elem = $('.dom'); 
    elem.on('click', (function() {
        return function foo(e) {
            // do something...
            elem.off('click', foo);
        };
    }()));

    定義的foo不會影響外面, 用完立即卸載等待回收.
    乾乾淨淨, 深藏功與名

    回覆
    0
  • 取消回覆