1
 function onMouseClickFunction() {

    $mapCanvas.click(function (e) {
        var x = cursor.getCursorPositionInCanvasX(e.pageX),
            y = cursor.getCursorPositionInCanvasY(e.pageY);

这个例子中的变量范围是什么,它是函数 onMouseclickFunction 还是 jquery 的匿名函数?

我要说的是,javascript 使用提升在其父函数的顶部创建变量,那么在这个例子中提升是在哪里完成的呢?

4

4 回答 4

5

每个正确声明的变量都将始终具有当前函数的局部范围。

由于您var正确使用了该语句,因此您的xy变量对于您的匿名函数是本地的。


如果您希望能够从您的onMouseClickFunction函数中访问这些变量,您应该在click事件处理程序之外声明它们。您仍然可以从单击处理程序中访问它们,因为该函数本身是在onMouseClickFunction函数中声明的。

这被称为 JavaScript 的作用域链查找:如果您使用的变量尚未在本地作用域内声明,JavaScript 将在当前变量上方的作用域中查找它(在匿名函数的情况下,它是外部onMouseClickFunction)。如果它也没有在那里声明,它将继续向上查找范围,直到它到达全局范围。

如果在作用域链的任何地方都找不到该变量,它将被声明为全局作用域中的新变量。这就是为什么必须始终使用语句声明变量的原因var,就像您所做的那样。

于 2012-10-31T14:37:43.570 回答
4

假设您的意思是变量xy,那么它就是传递给 的匿名函数click()

var总是作用于当前函数。

我要说的是,javascript 使用提升在其父函数的顶部创建变量,那么在这个例子中提升是在哪里完成的呢?

提升意味着当您使用 时var,该变量将被限定为函数的范围,即使您之前曾尝试使用它。

IE

function () {
    var x = 1;

    function () {
         alert(x);
         var x = 2;
    }
}

如果调用了内部函数,它会发出警报undefined,因为在内部函数的范围内var x = 2创建了一个新函数(被提升),但是直到警报之后才会发生分配(因为没有提升分配)。xvar

问题中的所有var语句都出现在它们出现的函数的顶部,因此提升没有区别。

于 2012-10-31T14:38:14.623 回答
0

您在这里创建的是一个闭包

因此,匿名函数将继承 onMouseClickFunction 的作用域,但变量 x 和 y 仅在匿名函数的作用域内。

于 2012-10-31T14:43:58.417 回答
0

它将是后者(匿名函数),因为这是声明变量的函数。

于 2012-10-31T14:38:55.750 回答