【问题标题】:javascript/jquery function scopejavascript/jquery 函数作用域
【发布时间】:2012-10-31 14:36:33
【问题描述】:
 function onMouseClickFunction() {

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

这个例子中的变量作用域是函数 onMouseclickFunction 还是 jquery 的匿名函数?

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

【问题讨论】:

标签: javascript jquery scope


【解决方案1】:

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

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


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

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

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

【讨论】:

    【解决方案2】:

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

    var 始终作用于 current 函数。

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

    提升意味着当你使用var时,该变量将被限定为函数的作用域,即使你之前尝试过使用它。

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        您在此处创建的是closure

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

        【讨论】:

          猜你喜欢
          • 2017-05-26
          • 2011-03-10
          • 2011-03-11
          • 2015-04-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多