每个循环检查函数是否存在

时间:2015-03-18 11:36:23

标签: javascript jquery arrays each typeof

我正在使用第三方CMS开发网站,我必须在内容的各个部分包含功能,具体取决于所显示的页面。为了减少每次页面加载时调用的函数数量,我想循环遍历一组函数,以便在触发它们之前检查它们是否存在。

然后在body onload上调用这个单个函数。

我修改了Javascript Array of FunctionsHow to implement an array of functions in Javascript?以及isFunction的代码。

我的理解是我可以将函数放在没有()的数组中并且它们不会被调用但是在我的Chrome控制台中,在数组中提到函数名称的行上会生成未捕获的引用错误。

e.g。 jb_underimage_height函数不在所有页面的代码中,因此当它不存在时会生成错误。

以下是目前的代码:

function jb_onloads() {

var functionArray = [
jb_category_price_POA, 
jb_highlight_tech_columns,
jb_underimage_height,
jb_moveGuestButton,
jb_loginCheck,
jb_moveRefineSpan, 
jb_style_from_url, 
materials_dropdown,
jb_remove_search_spaces, 
jb_init_social,
checkCookies,
jb_category_change_class, 
jb_move_basket_text,
jb_style_form,
jb_checkNotifyEnvelope
]; // end of functionArray

$.each(functionArray, function(key, value) {

    if(typeof functionArray[key] !== 'undefined' && typeof functionArray[key] === "function") { functionArray[key](); } 
}); 

} // end of jb_onloads

3 个答案:

答案 0 :(得分:1)

当我不得不这样做时,这就是我的解决方法。

function a() { alert ("I am a") };
function b() { alert ("I am b") };

var arr = [
    typeof a === "function" && a || 0,
    typeof b === "function" && b || 0,
    typeof c === "function" && c || 0
];

arr.forEach(function(func) {
    if(typeof func === "function") {
         func();
    }
});

答案 1 :(得分:0)

也许我们可以这样做:

1个函数定义:

if (typeof myFuncCollections == "undefined") // window.myFuncCollections
    myFuncCollections = {};
myFuncCollections.func1 = function func1() {
    console.log("func1");
};
//or
myFuncCollections['funcname'] = function funcname() { 
    console.log("funcname");
}
....

2 jb_onloads()

function jb_onloads() {
    if (typeof myFuncCollections == "undefined") 
        myFuncCollections = {};
    $.each(myFuncCollections, function(i) {     
        myFuncCollections[i]();           
    });
}

3在包含1和2之后调用jb_onloads()。并且在2脚本之前不需要包含1脚本。此外,在包含1脚本之后,您可以在jb_onloads之外的1脚本中使用任何函数。

由于使用全局值,请使用特殊前缀来命名您的" myFuncCollections"

答案 2 :(得分:-1)

您正在尝试向数组插入函数引用。但是如果没有定义函数,则该名称不存在,从而出现错误。

将它们添加为字符串

function jb_onloads() {

    var functionArray = [
      'jb_category_price_POA',
      'jb_highlight_tech_columns',
      'jb_underimage_height',
      'jb_moveGuestButton',
      'jb_loginCheck',
      'jb_moveRefineSpan',
      'jb_style_from_url',
      'materials_dropdown',
      'jb_remove_search_spaces',
      'jb_init_social',
      'checkCookies',
      'jb_category_change_class',
      'jb_move_basket_text',
      'jb_style_form',
      'jb_checkNotifyEnvelope'
    ]; // end of functionArray

    $.each(functionArray, function(index, functionName) {
      // assuming functions are in the global scope
      var func = window[ functionName ],
          funcType = typeof func;
      if (funcType === "function") {
        func();
      }
    });

  } // end of jb_onloads