2013-03-06 107 views
0

func.apply(this, arguments);在这段代码中做了什么特定的操作?我可以看到,在没有apply的情况下动态调整元素大小将无法工作,但是,在使用apply之后,似乎没有进一步完成thisarguments适用于此处的是什么?

function throttle (func, wait) { 
    var throttling = false; 
    return function(){ 
     if (!throttling){ 
      func.apply(this, arguments); 
      throttling = true; 
      setTimeout(function(){ 
       throttling = false; 
      }, wait);    
     } 
    }; 
} 

jsbin

+0

它正在做'.apply'总是做什么。仅仅因为'this'和传入的参数在这里没有被使用,并不意味着它们不被用在'func'代码中。 – 2013-03-06 01:36:12

+0

你有函数'func'的代码吗? – bfavaretto 2013-03-06 01:39:40

+0

@bfavaretto它是jsbin链接中的'resize_columns()'。 – 1252748 2013-03-06 01:40:57

回答

2

.apply允许您设置方法调用的thisarguments值(并立即调用它)。这允许您在func.apply的调用者中使用的func内部使用相同的this。通常,func内部的this可能是其他内容(如果它是全局函数,则可能为window)。

此外,.apply可让您设置数组的参数,因此您不必提前知道参数列表。

编辑:在这个特定的情况下(jsbin)它不需要,因为func从来没有使用this或有任何参数。您只能使用func()

+0

我相信他知道'apply'的用处。他问为什么在这里使用**,我认为没有理由这样做。 – gdoron 2013-03-06 01:37:39

+0

@gdoron很难说;取决于'func'是什么(以及''this'通常在'func'内部)以及如何调用返回的函数。 – 2013-03-06 01:38:34

+0

在jsbin中,我没有看到'this'在哪里被使用,或者为什么它的移除会破坏任何东西。 'resize_columns()'('func'指的是什么)不需要参数。谢谢。 – 1252748 2013-03-06 01:40:08

1

节流()函数返回一个匿名函数。所以应用程序允许匿名函数再次调用自己并将原始参数传递给它。

因此,代码本质上是检查它是否受到限制,如果不是,则将throttling设置为true,并在超时结束时将throttle设置为false。

+0

这是正确的答案。为了扩展代码的功能,它确保每次发布window.resize事件时都不会尝试调整大小(这会导致缓慢下降)。相反,它会等待查看自上次调整大小事件以来是否已经过n ms,以试图推断用户是否已停止调整窗口大小。由于原始问题中的代码示例不需要任何参数来“存活”迭代,因此节流代码似乎是独立于调整大小代码编写的。 – 2013-03-06 01:42:46

+0

@ chris-mv:整理。匿名函数从不会自行调用。它调用传递给油门的原始功能。这可能是什么意思。 – 2013-03-06 01:46:30

+0

@系统是啊,我就是这样读的。 :) – 2013-03-06 01:48:26

相关问题