可以从函数中访问的变量作为参数传递给Event.observe()(prototype.js)。为什么?

时间:2013-10-18 09:25:36

标签: javascript prototypejs scope

我在其中一个网站上有以下工作的JS脚本。我想知道为什么变量'countryEl'和'zipEl'可以从传递给Event.observe的函数中访问。有人可以解释一下吗?

提前致谢!

    <script type="text/javascript">
        //<![CDATA[

        document.observe("dom:loaded", function() {

            var form = $('shipping-zip-form');
            var countryEl = form.down('#country');
            var zipEl = form.down('#postcode');

            Event.observe(countryEl, 'change', function () {
                var selectedValue = $(countryEl).getValue();
                if (selectedValue == 'US') {
                    zipEl.addClassName('validate-zip-us');
                }
                else {
                    zipEl.removeClassName('validate-zip-us');
                }
            });
        });
        //]]>
    </script>

2 个答案:

答案 0 :(得分:0)

如果没有,生活会变得更加困难。显然,document.observe中的私有变量仍然是Event.observe中的本地变量,可能是由api的一些玩法传递的。但你宁愿不这样做吗?如何帮助我无法想象。

答案 1 :(得分:0)

以下代码片段演示了变量“v”只能从定义它的上下文中访问,也就是说“外部”函数的上下文。因此,在此上下文中定义的函数也可以访问“v”。

function outer () {
  var v = 'hello!';
  inner();
  log('from outer: ' + v);
  function inner () {
    log('from inner: ' + v);
  }
}

try {
  outer();
  log('from global: ' + v);
} catch (e) {
  log(e);
}
<script>function log(s){document.body.innerHTML+=s+'<br>'}</script>

更多:http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html


附加说明

“内部”功能和环境的组合称为“闭合”。关于确切的定义,我仍然有点困惑。有些人可能会使用这个术语来指定“内部”功能本身,但听起来更像是误用。以下是MDN的说法:

  

闭包是指独立(自由)变量的函数。换句话说,闭包中定义的函数“记住”创建它的环境。 (MDN

  

闭包是一种特殊的对象,它结合了两个东西:一个函数,以及创建该函数的环境。 (MDN