繁体   English   中英

javascript / jquery函数范围

[英]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语句,因此xy变量对于匿名函数而言是本地的。


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

这称为JavaScript的作用域链查找:如果未在本地作用域中声明您使用的变量,则JavaScript会在当前作用域正上方的作用域中查找它(对于您的匿名函数而言,它是外部的onMouseClickFunction )。 如果也未声明,它将一直沿范围向上搜索,直到到达全局范围。

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

假设您的意思是变量xy ,那么它是传递给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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM