2

对于此代码块:

  if(!skipit)
    {
    var update_argument='';
    if (document.formname.fieldname)
      {
        update_argument=document.formname.fieldname[document.formname.fieldname.selectedIndex].value;
      }
    window.setTimeout('updatepcols(update_argument)',250);
       return false;
    }

我在 setTimeout 调用中收到一个错误,即“update_argument”未定义。当我将分配空字符串值的行从“var”更改为“window.”时,错误消失了,代码工作了。我猜这里存在范围问题,但我不遵循它。为什么在这种情况下 update_argument 是未定义的,但是将它放在窗口对象中让我可以使用它?(updatepcols 是一个更新定价列的函数。)

4

3 回答 3

4

试试这个。以这种方式使用闭包可以保留对update_argument

setTimeout(function(){
    updatepcols(update_argument);
},250);

我有一种有趣的感觉,您作为text传递的脚本在评估时会在全局范围内执行,即在update_argument声明的本地范围之外。

setTimeout('updatepcols(update_argument)',250);
于 2012-06-22T17:41:47.757 回答
1

我不确定这是否是范围问题,但改变你的 setTimeout 调用应该可以解决问题:

window.setTimeout('updatepcols('+update_argument+')',250);

这个小提琴演示:http: //jsfiddle.net/mLrqZ/

于 2012-06-22T17:48:32.113 回答
0

改变你的表情。如果要将局部变量传递给回调函数,应该这样写:

window.setTimeout('updatepcols('+update_argument+')', 250);

或者,如果您想改用闭包,请执行以下操作:

window.setTimeout(function(){ updatepcols(update_argument) }, 250);

是的,就像其他人说的那样,使用闭包是更好的做法。

于 2012-06-22T17:57:19.980 回答