为什么自我=这个成语在这种情况下出错了?

时间:2014-08-23 13:11:49

标签: javascript jquery closures

这是之前的代码:

...
'postInitialization':function(){
  var S = this;
  $(document).on('click','.myButton',function(e){
    e.preventDefault();
    var ix = $(this).data('index');
    S.doSomething(ix);
    });
 },
 ...

这有一个微妙的错误,而我的代码后修复了它:

...
'postInitialization':function(){
  window.SAVE_S = this;
  $(document).on('click','.myButton',function(e){
    e.preventDefault();
    var S = window.SAVE_S;
    var ix = $(this).data('index');
    S.doSomething(ix);
    });
 },
 ...

在这两种情况下,代码都使用如下:

var S = {
  ...
  'list':[],
  'postInitialization':{...},
  ...
  };
...
S.postInitialization();
...

稍后会在某些内容中添加S.list的条目,例如S.list变为["hello world"]。然后,在此之后,在{DOM}中创建.myButton,然后在此之后的某个时间点击它。

第一种情况中的问题是doSomething()函数S.list为空。通过将其分配给显式全局,在我的固定代码中,S.list包含我期望的条目。换句话说,通过使用var S = this;成语,它似乎正在拍摄S在该点存在的快照,因此错过了后来的更改。 (注意:其他所有工作,函数调用,S数据的其余部分都在那里等。)

这是否与使用jQuery的on()将事件处理程序附加到尚不存在的DOM对象有关?

而且,虽然window.SAVE_S有效,但感觉很粗糙。有更好的解决方法吗?

0 个答案:

没有答案