【问题标题】:Javascript scopeJavascript 范围
【发布时间】:2011-06-23 03:07:37
【问题描述】:

我有一个与此结构相似的脚本

$(function(){

  var someVariable;

  function doSomething(){
      //here
  }

  $('#something').click(function(){
      //here
  })

});

我的问题是;

来自 doSomething 函数和点击处理程序
如何在不传入的情况下访问 someVariable?

【问题讨论】:

    标签: javascript jquery closures scope


    【解决方案1】:

    只需使用它。不需要this

    $(function(){
        var someVariable = 3;
        function doSomething(){
            alert(someVariable);
        }
    });
    

    【讨论】:

    • 内部函数自动访问外部作用域中定义的变量。
    【解决方案2】:

    您可以在没有任何特殊语法的情况下使用它。 someVariabledoSomething 的闭包范围内可用。

    Read more on JavaScript closures

    【讨论】:

    • 奇怪,由于某种原因它之前不起作用:/将尽快接受(由于链接到额外的资源)
    • 在问题的代码中,doSomething 不用于创建闭包,尽管传递给点击处理程序的匿名函数是。
    • 关闭可能会令人困惑。它也被称为“词汇范围”,我认为它更易于理解。范围内的内容可以纯粹确定,但要查看源代码并查看包含您的代码的内容。
    【解决方案3】:

    ECMA- / Javascript 方法被调用(调用)时,会发生几件事。长话短说,当调用一个函数时,会为该函数创建一个名为Activation object 的函数。在该对象中,您会发现参数局部变量和函数声明以及参数对象。被调用函数的“上下文”具有[[Scope]] 属性。这是调用函数时存储所有父上下文的地方。

    这个概念(我在这里几乎把它缩小了)是拥有闭包的基本内容。这意味着如果您在示例中调用doSomething(),该函数会将父上下文复制到它的[[Scope]] 中,其中包括someVariable。事件监听器的匿名函数做同样的事情,两个方法共享相同的范围


    简短回答:您可以在所有方法中使用和访问someVariable

    【讨论】:

      猜你喜欢
      • 2013-10-23
      • 1970-01-01
      • 2018-12-22
      • 2015-03-09
      • 1970-01-01
      • 1970-01-01
      • 2020-02-07
      • 2012-05-21
      • 2012-12-23
      相关资源
      最近更新 更多