javascript - JavaScript 中作用域的行为

标签 javascript

<分区>

Possible Duplicate:
Confused by Javascript's variable scope

例如,这是我的 JavaScript 代码:

var foo = 'Originalvalue';
var foo = 'Nextvalue';
alert(foo); // Nextvalue

那么,现在我确定在一个已经声明的变量前面写 var 只是简单地无效并且对程序没有用。

但是考虑一下这个程序:

var foo = 'Originalvalue';
function duhfoo() {
  var foo = 'Newbievalue';
}
duhfoo();
alert(foo); // Originalvalue

然后,根据我在第一个示例中解释的逻辑,该值应该是“Originalvalue”,因为已经有一个名为 foo 的变量。那为什么会这样呢?

最佳答案

在 Javascript 中有两种变量:局部变量和全局变量。

在函数外使用 var 时,您声明了一个 global 变量,如果您根本不使用 var,也会发生同样的情况。写作

foo = "first";

在顶层(在任何函数之外)与 var foo = "first" 相同。

但是在函数内部时情况就不同了,关键字 var 区分localglobal 变量:

var foo = "first";
var bar = "second";

function f()
{
    var foo = "third"; // local
    bar = "fourth";    // global
}

f();
alert([foo, bar]); // output will be first,fourth

换句话说,当您在函数内部使用 var 时,变量将是不同的同名变量,只有在函数边界内编写的代码才可见。

请注意边界是由函数决定的,而不是大括号 {...}。如果您有嵌套 block 并在 block 内使用另一个 var 声明,则变量将是相同的,这与 Java、C 或 C++ 等其他语言中发生的情况不同。

创建范围的唯一方法是定义一个函数(包括函数内的函数)。

在 Javascript 中要记住的另一个非常重要的事情是“捕获”/“闭包”的概念(特别是如果接触过类似的语言,其中没有这个概念,如 Java、C 或 C++)。

var foo = "first";

function f()
{
    // Local variable
    var foo = "second";

    function g()
    {
        // This is the local foo of f, not the global
        // one even if there is no "var" declaration
        // inside this nested scope
        return foo;
    }

    return g;
}

var nested_function = f();

alert([foo, nested_function()]); // output will be first,second

基本上,局部变量可以“比”定义它的函数“长寿”,方法是被其他据说“捕获”该变量的函数使用。捕获一个或多个变量的函数称为“闭包”。

换句话说,局部变量仅在函数体内可见,但它的生命周期可能比 function 长,就像 last 的局部 foo 一样示例中变量在从 f 返回后仍然存在,因为它已被闭包 g 捕获。

关于javascript - JavaScript 中作用域的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12614594/

相关文章:

javascript - 将 href 添加到 txthtml 列

调用另一个函数的javascript书签

javascript - 动态添加属性到 JSON 数组

c# - jQuery "Microsoft JScript runtime error: Object expected"

javascript - 如何存储和检索窗口状态?

javascript - php 中的计数查询

javascript - 将用户区域设置包含到 Keycloak ID token 中

javascript - 在闭包上下文中抛出错误未到达 catch 子句

javascript - 将 VueJS 连接到 RabbitMQ

javascript - 将监听器附加到多个 child