javascript - 变量作用域上的简单点 - Javascript

标签 javascript global-variables scope

这个问题在这里已经有了答案:




8年前关闭。




Possible Duplicate:
JavaScript Variable Scope



我(显然)对 Javascript 非常陌生,并且我已经在其他线程上看到了关于全局和局部变量的使用的几个不同观点,但我试图将有关该主题的一些基本观点锁定在一个地方。

以下在函数外部声明(或在函数内部使用)之间有什么区别?

变量事物 = 1;

东西 = 1;

我知道使用 var 声明了它当前范围内的变量。因此,省略 var 使其成为全局性的。有哪些可能会出现的陷阱?有人可以举一个简单的例子来说明在这种情况下变量可能会相互影响的地方吗?

提前致谢。

最佳答案

  • 如果您已经在全局范围内,那么差异很小,您不必担心
  • 假设您有两个 for循环,你想用它们做点什么。

  • .
    for (i = 0; i < elements.length; i++) {
        element = elements[i];
        for (i = 0; i < items.length) {
            item = items[i];
            element.add(item);
        }
    }
    

    这段伪代码可以在许多不同的语言中正常工作。
    程序会看到一个内循环和一个外循环,并且可以告诉 i不是指同一件事。

    在 JavaScript 中,它们是相同的 i .
    那是因为其他语言具有块作用域——每当您输入新的大括号时,程序都会将变量视为新变量。

    在 JavaScript 中只有函数作用域,这意味着函数内部的变量被视为新的,但在控制语句内部( ifforswitch ),它们是具有相同值的相同变量。
    所以外循环设置i到 0,然后进入内循环。
    内部循环遍历它的所有项目列表,并构建 i随着它的发展...
    然后它返回到外循环,然后 i仍然等于 items.length - 1 ...
    如果小于 elements.length然后它在 i 上加 1 ,现在高于 items长度,所以在内循环中什么也没有发生......
    ...如果items.length大于 elements.length相反,外循环在一次通过后就结束了。

    现在,我相信您可以开始考虑您可能想要使用 x 的时间。或 namevalueelsumidefaultsrcurlimgscript等在你的整个程序中多次(甚至数万行),你可以开始考虑类似上面循环的情况,如果你尝试用相同的名字调用两个不同的东西,事情可能会出错。

    这与 var-fallthrough 的问题相同

    如果您有一个函数使用名为 x 的变量另一个函数使用另一个名为 x 的变量,那太好了...
    ...除非你忘记声明变量。
    // no problems!
    function func1 () { var x = 0; }
    function func2 () { var x = "Bob"; }
    
    // big problems!
    function func1 () { x = 0; }
    function func2 () { x = "Bob"; }
    
    func1套装window.x = 0;func2套装window.x = "Bob";
    ...如果window.x应该等于 42,为了让其他程序正常工作,现在你有可能有 3 个损坏的应用程序,只是因为缺少一些 var s。

    但是,它不会立即设置全局变量。它实际上做的是通过功能链。如果您在另一个函数内部创建一个函数,那么未声明的 var 将查找其父级的 vars,然后是其祖 parent 的 vars,然后是其曾祖 parent 的 vars...
    如果它一直到window并且没有人拥有该名称的变量,然后它会在 window 上创建一个具有该名称的变量。 .
    function func1 () {
        var x = 0;
    
        function func2 () {
            var y = 1;
            x = 2;
            z = 3;
        }
    
        func2();
    }
    

    当您调用 func1 时,它会设置自己的 x到 0,并调用 func2。
    func2 设置自己的 y到 1。
    然后它设置func1的x到 2。
    然后,因为 func2 没有 z而 func1 没有 zwindow没有 z ,它设置 window.z到 3。

    这只是困惑的开始,为什么它是一个非常非常好的主意,以确保您定义的变量需要在该函数内部可用(以及在该函数内部创建的任何函数中)......
    ...当你引用预先存在的变量时,你会仔细引用它们,并知道该变量应该在你的代码中的位置(哪个函数定义了它............所以程序在链上的位置在它到达 window 之前停止查看),以及为什么要从另一个函数内部更改它。

    关于javascript - 变量作用域上的简单点 - Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12805493/

    相关文章:

    javascript - 在 Indesign 框架内操作图像

    jQuery 从每个循环中获取数据并存储在全局变量中

    Javascript函数范围/执行顺序问题

    gradle - Gradle/Groovy从内部 block 中引用 “file-wide/global”变量

    java - 为什么我们要在 spring 中使用自定义作用域?什么时候需要?

    javascript - 为什么我不能访问这个 JS 函数? undefined 不是函数?

    javascript - 如何将整个数组作为字符串获取?

    javascript - 从 Landing 导航到 Ionic 2+ 中的特定选项卡动态

    javascript - Jquery Mobile 日期选择器事件不起作用

    python - 如果加载的模块依赖于全局变量,如何正确地按部分加载Python代码?