jQuery事件回调和全局变量

时间:2015-08-17 15:33:49

标签: javascript jquery backbone.js callback scope

我正面临着一种奇怪的行为,这种行为违背了我对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怎么没有得到正确的更新?

我很确定我可以轻松找到解决此问题的方法,但这不能帮助我理解为什么这不起作用。

如果有人能向我解释为什么会这样,或者指向一个合适的资源,我会非常感激!

1 个答案:

答案 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)。