4

使用 JavaScript,假设innerFunction()outerFunction(). 如果您尝试在innerFunction()之外调用 ,outerFunction()则会出现错误,因为它未在范围内定义。
但是,如果在 中outerFunction(),您将 分配innerFunction()给一个事件,比如单击事件,对于某些外部元素,例如 a button,则innerFunction()可以从按钮的该范围调用,无论它可能是什么。那么,为什么您能够从innerFunction()不同的范围进行第二次调用。

我有一个工作示例:http: //jsfiddle.net/rcmoore38/gPrMk/

初始changeColor()调用不起作用,但是当changeColor()分配给时button,可以通过按钮调用。

谢谢!

4

1 回答 1

2

没有“按钮的范围”。发生的情况是您从内部函数可见的范围分配事件侦听器,这在 JavaScript 中很重要。JS 中的作用域是关于函数的声明位置。

在您的示例中:

$("#b").click(function() { changeColor() });

该函数changeColor可通过匿名函数内部的闭包获得,因为它是在外部作用域中声明的。定义嵌套函数时,父函数中的所有变量和函数都将在其中可用。因此,当单击元素并调用匿名函数时,它仍然具有对 的引用changeColor,并且能够调用它。

您也可以在不使用闭包的情况下设置事件处理程序,如下所示:

$("#b").click(changeColor);

正如我所说,重要的是changeColor当你引用它时它在范围内(而不是当它实际调用时,在这种情况下,由浏览器调用)。

于 2013-07-26T16:09:11.943 回答