【问题标题】:Changing a Variable Out of Scope?更改超出范围的变量?
【发布时间】:2010-05-04 02:49:26
【问题描述】:

有没有办法在超出范围时更改变量?我知道一般来说,你不能,但我想知道是否有任何技巧或覆盖。例如,有没有办法使以下工作:

function blah(){
 var a = 1
}
a = 2;
alert(blah());

编辑(澄清):

假设的场景是修改一个在 setInterval 函数中使用的变量,该函数也超出了范围,并且在一个不可编辑的以前的 javascript 文件中。这是一个非常古怪的场景,但这是我想问的。

【问题讨论】:

    标签: javascript variables scope


    【解决方案1】:

    没有。没有技巧或覆盖。您必须计划让两个地方都能够在同一范围内看到变量。

    我能想到的关于范围的唯一技巧是在浏览器中使用window 来访问全局对象。这可以帮助您找到一个“隐藏”变量——一个在范围内但其名称已被局部变量(或范围链中更接近的其他变量)取代的变量。

    闭包和类可以为您提供一些其他的作用域技巧,但没有一个可以让您完全覆盖作用域规则。

    【讨论】:

    • 感谢您的想法。我将让这个问题坐一会儿,以防其他人知道任何技巧。否则,这是正确的答案。谢谢。
    【解决方案2】:

    我不明白您为什么需要这样做,如果您需要一个可从外部访问的变量,只需在外部声明它即可。

    现在,如果您只是因为想学习一些东西而问这个问题,那对您有好处。

    var a = 0;
    
    function blah() {
        a = 1;
        return a;
    }
    a = 2;
    
    alert(blah());
    

    【讨论】:

    • 指出,因为是的,我在胡闹一个古怪的场景,你似乎已经意识到了;)
    【解决方案3】:

    你当然可以从函数中返回值:

    function blah() {
        var a=1;
        return a;
    }
    

    但我认为这与您的想法不太一样。因为函数调用会在局部变量上创建一个闭包,所以通常不可能在创建闭包后修改这些值。

    对象有些不同,因为它们是参考值。

    function blah1(v) {
        setInterval(function() {
           console.log("blah1 "+v);
        }, 500);
    }
    function blah2(v) {
        setInterval(function() {
           console.log("blah2 "+v.a);
        }, 500);
    }
    
    var a = 1;
    var b = {a: 1};
    blah1(a);
    blah2(b);
    setInterval(function() {
       a++;
    }, 2000);
    setInterval(function() {
       b.a++;
    }, 2000);
    

    如果您在带有控制台对象的环境中运行它,您会看到 blah2 中报告的值在 2 秒后发生变化,但 blah1 继续使用相同的 v 值。

    【讨论】:

      【解决方案4】:

      函数可以访问在其作用域之外声明的变量,如果它们是在函数本身之前声明的:

      var a = 0;
      function blah() {
          a = 1;
      }
      a = 2;
      alert(blah());
      

      请注意,您在函数内部使用 var a 声明了一个名为 a 的局部变量;在这里,我们省略了关键字,否则它会隐藏 a 在外部作用域中声明的内容!

      【讨论】:

      • 糟糕,我错过了 return 关键字。
      • 它们不需要在函数定义之前声明。
      【解决方案5】:

      不,这永远行不通,但你可以使用全局:

      var a;
      function blah(){
       a = 1
      }
      a = 2;
      alert(blah());
      

      或使用闭包:

      function bleh() {
          var a;
          function blah(){
           a = 1
          }
          a = 2;
          alert(blah());
      }
      

      或者您可以通过返回传递它(其行为不同,但可能是您想要做的):

      function blah(a){
       a = 1
       return a;
      }
      a = 2;
      alert(blah(a));
      

      【讨论】:

      • 你忘了返回
      猜你喜欢
      • 1970-01-01
      • 2016-04-30
      • 1970-01-01
      • 2016-03-05
      • 1970-01-01
      • 1970-01-01
      • 2021-10-04
      • 1970-01-01
      • 2020-12-24
      相关资源
      最近更新 更多