0

我正在处理的站点之一中有以下工作 JS 脚本。我想知道为什么可以从传递给 Event.observe 的函数中访问变量“countryEl”和“zipEl”。谁能解释一下?

提前致谢!

    <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>
4

2 回答 2

0

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

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

try {
  outer();
  console.log('from global: ' + v);
} catch (e) {
  console.log(e.message);
}

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


###补充说明

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

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

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

于 2013-11-22T06:56:34.363 回答
0

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

于 2013-11-21T16:03:34.590 回答