我正面临着一种奇怪的行为,这种行为违背了我对JS中闭包和范围的理解。
这是我的代码示例:
var cta_container = $("#call_to_action_container");
var cta_div = "<div>SOME VARYING HTML</div>";
var ruler = $('<div id="height_ruler"/>');
var ctac_height;
ruler.append(cta_div);
cta_container.append(ruler);
ctac_height = ruler.outerHeight();
// If we already reached phase 3, we don't attach handlers again
if (!this.reached_phase_3) {
cta_upper.click(function(event) {
console.log("Height during click callback : "+ ctac_height);
});
}
this.reached_phase_3 = true;
console.log("Height before click : "+ ctac_height);
cta_upper.click();// Manually triggering the click
console.log("Height after click : "+ ctac_height);
这是Backbone的View方法的一部分。
基本上,我有一个div
我可以通过点击来切换。此div
会随着时间的推移而改变大小。我从outerHeight
事件回调中将click
作为全局变量进行访问。但回调范围内的值并没有得到更新,尽管Backbone的View方法中的值得到了正确更新。
例如,第一次单击时,此代码可能会输出:
Height before click : 100
Height during click callback : 100
Height after click : 100
然后,在div
高度发生变化后,我再次点击并获取例如:
Height before click : 147
Height during click callback : 100
Height after click : 147
ctat_height
变量的值在设置回调的方法调用中更新,但不在回调范围内。
根据我对闭包的了解,他们不会在其范围内复制全局变量值,而是通过范围链访问它们。那么ctat_height
怎么没有得到正确的更新?
我很确定我可以轻松找到解决此问题的方法,但这不能帮助我理解为什么这不起作用。
如果有人能向我解释为什么会这样,或者指向一个合适的资源,我会非常感激!
答案 0 :(得分:0)
基于@ Kevin-b的回答,我发现了一个非常快速的解决方案,即在#!/bin/sh
basedir=$1
for subdir in "$basedir"/*/; do
dir=`basename $subdir`
# Some other code here
# ...
echo "Removing subdirectories $subdir/*"
rm -rfv "$dir/"*
done
范围内设置ctac_height
变量(this.ctac_height
而不是var ctac_height
)。