2011-08-09 157 views
1

我需要一个函数来检查jQuery中的函数是否存在,如果是,那么应该调用这个函数。如果我用一个简单的名字使用下面的代码,但是如果我想动态地检查一个函数是否存在,它不起作用。有没有人有想法?检查功能是否动态存在

function homeController() { 
    console.log('in the homecontroller'); 
} 

$('div[class="view"]').each(function() { 
     $('#' + this.id).live('pageshow', function() { 
      var func = this.id + 'Controller';    
      if($.isFunction(func)) { 
       console.log('jquery exists'); 
      } 
     }); 
    }); 
+0

你的意思是你想测试任意JavaScript函数是否在范围内?当然'func'在你的例子中只是一个字符串,而不是一个函数。 –

回答

3

使用jQuery.isFunction()方法来检查对象是否是一个函数或没有。

$('div[class="view"]').each(function() { 
     $('#' + this.id).live('pageshow', function() { 
      var func = eval(this.id + 'Controller');    
      if($.isFunction(func)) { 
       console.log('jquery exists'); 
      } 
     }); 
    }); 
1

我认为你需要使用eval的,因为你的func是一个字符串。

var func = eval(this.id + 'Controller'); 
if($.isFunction(func)) { 
    func(); 
} 
+0

如果我使用''eval'',它将执行该函数并在函数不存在时抛出错误,所以我需要另一种方式。 –

+0

如果你没有在末尾加上括号'()',它将不会执行,只会得到它的值。 – jcubic

+0

我不会在最后加上括号,但我仍然在我的情况下得到一个错误“listController”未定义。 –

0

你需要弄清楚你的函数是在范围(或者换句话说,它的对象是你的函数的性质),然后用

if ($.isFunction(scope[func])) { 
    ... 
} 

将名称转换所需要的函数转换为当前范围内对该函数的引用。

这当然假设你的功能实际上是的一些范围。

因此,如果您的homeController()函数已在全局范围内声明,它将是全局对象的一个​​属性。

但是,如果他们刚刚被声明为其他闭包内的内部函数,他们将不会有一个。

1

$ .isFunction - “确定传递的参数是否是Javascript函数对象”。显然,你正在传递一个字符串。

如果你想检查jQuery插件不是使用

if (typeof jQuery[yourFunctionName] == 'function') { .. 

和一般的JavaScript函数 -

if(typeof window[yourFunctionName] == 'function') { .. 
0
function doIt(callback) { 

    console.log('Did it'); 

    typeof callback === 'function' && callback(); 

} 

这只有在函数存在执行回调。您可以从该功能中拉出该线并在任何地方使用。