首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >javascript/jquery函数作用域

javascript/jquery函数作用域
EN

Stack Overflow用户
提问于 2012-10-31 22:36:33
回答 4查看 113关注 0票数 1
代码语言:javascript
复制
 function onMouseClickFunction() {

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

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

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-31 22:38:15

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

var的作用域始终为当前函数。

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

提升意味着当您使用var时,变量的作用域将是函数的作用域,即使您以前试图使用它。

代码语言:javascript
复制
function () {
    var x = 1;

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

如果内部函数被调用,它将警告undefined,因为var x = 2在内部函数的作用域中创建了一个新的x (var被提升),但是赋值直到警报之后才发生(因为赋值没有被提升)。

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

票数 4
EN

Stack Overflow用户

发布于 2012-10-31 22:37:44

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

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

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

这就是所谓的JavaScript范围链查找:如果您正在使用的变量没有在本地范围内声明,JavaScript将在当前范围的正上方的范围中查找该变量(对于匿名函数,该范围是外部onMouseClickFunction)。如果它也没有在那里声明,它将一直向上查找,直到它到达全局作用域。

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

票数 5
EN

Stack Overflow用户

发布于 2012-10-31 22:38:56

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13160367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档