首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >了解JavaScript函数作用域

了解JavaScript函数作用域
EN

Stack Overflow用户
提问于 2013-06-13 03:05:43
回答 4查看 245关注 0票数 10

下面的代码是JavaScript代码。我试图理解JavaScript中的函数作用域,并在here上关注这篇文章。我正在重现下面的代码-

代码语言:javascript
运行
复制
var cow = "purple"; // just a random cow

var f = function (x) {
    var r = 0;
    cow = "glue";
    if (x > 3) {
        var cow = 1; // a local variable
        r = 7;
    }
    return r;
};

var z = f(2);
alert(cow); // returns purple

我不太明白为什么要提醒“紫色”这个字符串。cow = "glue";行应该将cow变量的值设置为"glue“。如果我删除If块,然后在最后一条语句中警告cow,我看到字符串"glue“被警告。

当f(2)被调用时,if代码块没有进入,并且其中没有任何东西被执行,那么为什么我会看到不同的结果呢?也就是说,为什么警示cow在最后一条语句中现在返回字符串“紫色”?

EN

回答 4

Stack Overflow用户

发布于 2013-06-13 03:08:26

函数内部的变量声明总是被提升到顶部。所以你的代码实际上是:

代码语言:javascript
运行
复制
var f = function (x) {
    var cow, r;
    r = 0;
    cow = "glue";
    if (x > 3) {
        cow = 1; // a local variable
        r = 7;
    }
    return r;
};

在函数内部,您总是分配给本地cow,而不是全局。

票数 9
EN

Stack Overflow用户

发布于 2013-06-13 03:09:04

这里要理解的两件事是,Javascript变量被提升到其作用域的顶部,并且javascript没有块作用域。

所以

  1. 作用域中的所有变量都被认为是在作用域的开头声明的
  2. if语句不会创建新的作用域。

所以你的例子等同于

代码语言:javascript
运行
复制
var cow = "purple"; // just a random cow

var f = function (x) {
    var cow, r = 0;
    cow = "glue";
    if (x > 3) {
        cow = 1; // a local variable
        r = 7;
    }
    return r;
};

var z = f(2);
alert(cow); // returns purple

if语句中的var声明被提升到顶部。此时,函数中的所有cow引用都引用局部变量cow,而不是外部作用域中的cow。

票数 5
EN

Stack Overflow用户

发布于 2013-06-13 03:08:15

Javascript没有块作用域( catch块除外)。

所有var语句都被提升到包含函数的顶部。

因此,即使if从不执行,cow也会引用函数中任何位置的局部变量。

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

https://stackoverflow.com/questions/17073335

复制
相关文章

相似问题

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