为什么setTimeout没有识别函数名?

时间:2014-07-29 12:10:06

标签: javascript jquery

(function( $ ){

   $.fn.hash = function(){

   function activate()
   {
      setTimeout('checkHash()', 100);
   }

   activate();

   var previousHashTag = location.hash;

   var previousHashProperty = '';

   function checkHash()
   {
     if( previousHashTag !== location.hash )
     {
        $('body').trigger("hashchange", [ getHashObj() ]);
        previousHashTag = location.hash;
        setTimeout( "checkHash()", 200);
     }
     setTimeout( "checkHash()", 100);
   }

这是我试图制作的哈希插件。 我想在用户加载插件时调用activate()函数。 activate函数将设置超时以每100毫秒检查一次哈希。 由于checkHash在此对象的函数之外,我怎么能把它拉掉呢?

2 个答案:

答案 0 :(得分:1)

您正在将字符串传递给setTimeout并对其进行评估。这打破了正常的范围。不要这样做,而是通过功能。

setTimeout(checkHash, 100);

现在范围将被保留,您可以从activate访问checkHash,反之亦然,因为它们在同一范围内声明。

答案 1 :(得分:1)

您在setTimeout中使用字符串参数,这意味着代码将在全局对象中运行。由于您的被调用函数是在另一个函数的闭包内定义的,因此您必须传递一个引用

setTimeout(checkHash, 100);

或使用匿名函数

setTimeout(function(){
  checkHash();
});

如果要将任何参数传递给从setTimeout调用的函数,则必须使用第二种方法。

setTimeout(function(){
  checkHash(arg);
});