我在其中一个网站上有以下工作的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>
答案 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)