[英]javascript/jquery function scope
function onMouseClickFunction() {
$mapCanvas.click(function (e) {
var x = cursor.getCursorPositionInCanvasX(e.pageX),
y = cursor.getCursorPositionInCanvasY(e.pageY);
在此示例中,变量作用域是什么?它是onMouseclickFunction函数还是jquery的匿名函数?
我要说明的是,javascript在其父函数的顶部使用了提升创建变量,因此在此示例中提升在哪里完成?
正确声明的每个变量将始终具有当前函数的局部作用域。
由于您正确使用了var
语句,因此x
和y
变量对于匿名函数而言是本地的。
如果您希望能够从onMouseClickFunction
函数访问这些变量,则应在click
事件处理程序之外声明它们。 您仍然可以从点击处理程序中访问它们,因为该函数本身是在onMouseClickFunction
函数中声明的。
这称为JavaScript的作用域链查找:如果未在本地作用域中声明您使用的变量,则JavaScript会在当前作用域正上方的作用域中查找它(对于您的匿名函数而言,它是外部的onMouseClickFunction
)。 如果也未声明,它将一直沿范围向上搜索,直到到达全局范围。
如果在作用域链的任何地方都找不到该变量,它将在全局作用域中声明为新变量。 这就是为什么必须像以前一样始终使用var
语句声明变量。
假设您的意思是变量x
和y
,那么它是传递给click()
的匿名函数。
var
始终是当前函数的作用域。
我要说明的是,javascript在其父函数的顶部使用了提升创建变量,因此在此示例中提升在哪里完成?
提升意味着,当您使用var
时,即使您先前尝试使用该变量,该变量也将在该函数范围内。
即
function () {
var x = 1;
function () {
alert(x);
var x = 2;
}
}
如果调用了内部函数,它将发出undefined
警报,因为var x = 2
在内部函数的范围内创建了一个新的x
(提升了var
),但是直到警报之后才进行赋值(因为赋值为没有悬挂)。
问题中的所有var
语句都出现在它们所在的函数的顶部,因此提升没有区别。
它将是后者(匿名函数),因为这是在其中声明变量的函数。
您在此处创建的是一个闭包 。
这样,匿名函数将继承onMouseClickFunction的范围,但是变量x和y仅在匿名函数的范围内。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.