Javascript检查function是否存在
我遵循这个指南来创build一个新的JS到Flash通信:
所以我的代码如下所示:
function getID( swfID ){ if(navigator.appName.indexOf("Microsoft") != -1){ me = window[swfID]; }else{ me = document[swfID]; } } function js_to_as( str ){ me.onChange(str); }
现在有时,我的onChange
不加载,但目前,萤火虫显示一个
me.onChange不是一个函数
错误,并完全停止。
我希望它能够优雅地降级,因为这不是我程序中最重要的特性。 我尝试了typeof
但仍然给出了相同的错误。
任何build议如何确保它存在,然后只执行onChange
?
(除了尝试抓住一件作品,下面的方法都不行)
尝试这样的事情:
if (typeof me.onChange !== "undefined") { // safe to use the function }
或更好(根据UpTheCreek upvoted评论)
if (typeof me.onChange === "function") { // safe to use the function }
我有这个问题。
if (obj && typeof obj === 'function') { ... }
如果obj碰巧是未定义的,则不断抛出一个引用错误。
最后我做了以下几点:
if (typeof obj !== 'undefined' && typeof obj === 'function') { ... }
一位同事指出,检查是否是!== 'undefined'
,然后=== 'function'
是多余的。
更简单:
if (typeof obj === 'function') { ... }
更清洁,工作很好。
编辑:我不假装知道为什么这个答案是接受的原因。 请改用Andrew Hare提出的解决scheme: https : //stackoverflow.com/a/1042154/42346
这是处理这种情况的一种方法:
function js_to_as( str ){ try { me.onChange(str); } catch(err) { // Handle error(s) here } }
如果您使用eval将string转换为函数,并且您想要检查这个eval'd方法是否存在,您需要在eval中使用typeof和函数string:
var functionString = "nonexsitantFunction" eval("typeof " + functionString) // returns "undefined" or "function"
不要反过来,尝试一个types的评估 。 如果你做一个ReferenceError会被抛出:
var functionString = "nonexsitantFunction" typeof(eval(functionString)) // returns ReferenceError: [function] is not defined
尝试typeof
– 寻找'undefined'
,说它不存在, 'function'
function”。 JSFiddle这个代码
function thisishere() { return false; } alert("thisishere() is a " + typeof thisishere); alert("thisisnthere() is " + typeof thisisnthere);
或者如果:
if (typeof thisishere === 'function') { // function exists }
或者在一行中使用返回值:
var exists = (typeof thisishere === 'function') ? "Value if true" : "Value if false"; var exists = (typeof thisishere === 'function') // Returns true or false
我会再走一步,以确保该属性确实是一个function
function js_to_as( str ){ if (me && me.onChange && typeof me.onChange === 'function') { me.onChange(str); } }
没有看到这个build议:me.onChange && me.onChange(str);
基本上,如果me.onChange是未定义的(这将是如果它没有被启动),那么它将不会执行后面的部分。 如果me.onChange是一个函数,它将执行me.onChange(str)。
你甚至可以进一步做:
me && me.onChange && me.onChange(str);
如果我是asynchronous的。
怎么样:
if('functionName' in Obj){ //code }
例如
var color1 = new String("green"); "length" in color1 // returns true "indexOf" in color1 // returns true "blablabla" in color1 // returns false
或者至于你的情况:
if('onChange' in me){ //code }
请参阅MDN文档 。
我喜欢使用这种方法:
function isFunction(functionToCheck) { var getType = {}; return functionToCheck && getType.toString.call(functionToCheck) === '[object Function]'; }
用法:
if ( isFunction(me.onChange) ) { me.onChange(str); // call the function with params }
function js_to_as( str ){ if (me && me.onChange) me.onChange(str); }
没有条件
me.onChange=function(){}; function getID( swfID ){ if(navigator.appName.indexOf("Microsoft") != -1){ me = window[swfID]; }else{ me = document[swfID]; } } function js_to_as( str ){ me.onChange(str); }
我会怀疑me
没有得到正确的分配onload。
将get_ID调用移动到onclick事件应该照顾它。
显然你可以进一步陷阱,如前所述:
function js_to_as( str) { var me = get_ID('jsExample'); if (me && me.onChange) { me.onChange(str); } }
我总是这样检查:
if(!myFunction){return false;}
只要把它放在任何使用这个函数的代码之前
//Simple function that will tell if the function is defined or not function is_function(func) { return typeof window[func] !== 'undefined' && $.isFunction(window[func]); } //usage if (is_function("myFunction") { alert("myFunction defined"); } else { alert("myFunction not defined"); }
Underscore.js库在isFunction方法中定义了这个方法(其中的注释可能会迎合一些浏览器的bug)
typeof obj == 'function' || false
这个简单的jQuery代码应该可以做到这一点:
if (jQuery.isFunction(functionName)) { functionName(); }
我有这样的情况下,函数的名称根据variables(在这种情况下,var'x')添加到函数名称中变化。 这工作:
if ( typeof window['afunction_'+x] === 'function' ) { window['afunction_'+x](); }
我已经尝试了接受的答案。 然而:
console.log(typeof me.onChange);
返回“未定义”。 我注意到规范说明了一个名为'onchange'而不是'onChange'的事件(注意camelCase)。
原来接受的答案更改为以下为我工作:
if (typeof me.onchange === "function") { // safe to use the function }
如果你正在检查一个jQuery插件的函数,你需要使用$ .fn.myfunction
if (typeof $.fn.mask === 'function' { $('.zip').mask('00000'); }
function sum(nb1,nb2){ return nb1+nb2; } try{ if(sum() != undefined){/*test if the function is defined before call it*/ sum(3,5); /*once the function is exist you can call it */ } }catch(e){ console.log("function not defined");/*the function is not defined or does not exists*/ }