首页  >  问答  >  正文

javascript - 是否应该避免在函数内声明函数(故意闭包除外)?

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

函数 test 在每次点击的时候被声明 然后 click 回调执行完被 GC 如果 dom 不止被一次点击 那么每次的点击回调都多了一步函数声明 我记得在 jshint 的规范里都不允许函数声明写到循环里 现在的情况不是类似吗?那么如何处理才是最完美的 我应该把 test 函数声明位置提到外部吗 那么这样又会造成闭包 导致 test 函数无法被回收的 如果用户只用到一次这块逻辑的话 显然是亏的 到底该如何权衡?~

迷茫迷茫2733 天前533

全部回复(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
  • 取消回复