Angularjs 为什么$timeout要求将带有参数的函数包装在匿名函数中?

Angularjs 为什么$timeout要求将带有参数的函数包装在匿名函数中?,angularjs,Angularjs,我在使用$timeout时遇到问题,在此网站上偶然发现了此解决方案: 虽然这回答了“如何”,但没有回答“为什么”。如果要使用$timeout延迟需要参数的函数的执行,为什么必须将其包装在匿名函数中,为什么无参数函数也不需要这样做?因为当回调函数最终被调用时,它是在没有任何参数的情况下被调用的 为什么$timeout需要包装带有参数的函数 匿名函数 $timeout不要求将函数包装在匿名函数中。只是可以说,$timeout不是您函数的朋友,不会将参数传递给您给他的函数。因此,给他一个与参数一起工

我在使用$timeout时遇到问题,在此网站上偶然发现了此解决方案:


虽然这回答了“如何”,但没有回答“为什么”。如果要使用$timeout延迟需要参数的函数的执行,为什么必须将其包装在匿名函数中,为什么无参数函数也不需要这样做?

因为当回调函数最终被调用时,它是在没有任何参数的情况下被调用的

为什么$timeout需要包装带有参数的函数 匿名函数


$timeout
不要求将函数包装在匿名函数中。只是可以说,
$timeout
不是您函数的朋友,不会将参数传递给您给他的函数。因此,给他一个与参数一起工作的函数是没有意义的。

$timeout
在参数中接受一个函数,并将在没有参数的情况下调用此函数

例如,
$timeout(foo)
将导致像这样调用
foo()
而没有参数,即使
foo
应该对某些参数起作用

因此,人们通常会将
foo
的调用封装到一个匿名函数中,以加快速度,但它完全可以是一个命名函数,如本例中所示:

function foo(name) { alert('hello ' + name) }
function fooBar()  { foo('bar') }

$timeout(fooBar)
// or, as this is totally equivalent
$timeout(function() { foo('bar') })
现在让我们了解一下,Javascript允许您使用关键字
bind
将参数绑定到函数。所以我们上面的例子也相当于:

$timeout(foo.bind(null, 'bar'))
实际上,
foo.bind(null,'bar')
也是一个与
fooBar
等效的新函数,它是
foo
,其中
被设置为
null
(因为它无论如何都不使用),并且参数
名称
被强制设置为
“bar”