替换eval以在变量名称空间中或在变量名称空间外调用函数

时间:2016-10-11 08:15:42

标签: javascript eval

我有一个变量namespace。从该命名空间我需要调用一个函数。我在变量namespace之外编写了一个函数。如果我使用window[functionName]那么该函数正在调用并执行。

假设我将函数放在变量名称空间中,那么该函数不会被调用。如果我使用eval那么它正在运行。是否有eval的替换来调用变量namespace.window[funcitonName].call(args)中的函数只有在该函数处于全局状态时才会执行。

我的要求是这样的:

var xxx = xxx || function($) {

  function onVehicleChange(..., functionName, ....) {
    window[functionName](this, args);
  }

  function maruthiVehicle(args) {

  }
}

这里我动态获取函数Name。假设我的functionName在这里maruthiVehicle;我在这里硬编码这个功能。

window[functionName]现在变为window[maruthiVehicle]未调用,因为我的function(maruthiVehicle)位于变量namespace(XXX)内。假设我将function(maruthiVehicle)放在此变量namespace(xxx)之外,那么它就可以了。

所以window[functionName]只在global范围内工作。我尝试使用eval。当我将函数放在变量eval之外或之内时,namepsace工作正常;

我不想使用eval。我想要替换此eval

eval(functionName + "(args)"); 无论我在变量内部或变量命名空间外的函数放置,我的函数调用都应该触发。

2 个答案:

答案 0 :(得分:1)

我相信您可以构建如下代码:

/* 
 * Global varibale - a namespace / place holder to keep the entities related to the application
 * This goes into the global variable - `window`
 */
vehicleNamespace = window.vehicleNamespace || {};

/* 
 *  Add functionality into that object
 */
vehicleNamespace = (function() {

  // Create a `local` function.
  var maruthiVehicle = function() {
    console.log("This is Maruthi");
  };
  
  // Return the object(s) that should be public in `vehicleNamespace`
  return {
    maruthiVehicle: maruthiVehicle
  }
})();

// call the function
window.onload = function() {
  vehicleNamespace.maruthiVehicle();
};

要调用函数dynamically,您可以根据要求使用callbind

请参阅下面的代码段:

/* 
 * Global varibale - a namespace / place holder to keep the entities related to the application
 * This goes into the global variable - `window`
 */
vehicleNamespace = window.vehicleNamespace || {};

/* 
 *  Add functionality into that object
 */
vehicleNamespace = (function() {

  var maruthiVehicle = function(input) {
    console.log(input);
  };

  var onVehicleChange = function(functionName, output) {
    // Note: You could also add more validations here to check if it is a `function`
    if (typeof functionName == 'function') {
      functionName.call(this, output);
    }
  }

  // Return the object(s) that should be public in `vehicleNamespace`
  return {
    maruthiVehicle: maruthiVehicle,
    onVehicleChange: onVehicleChange
  }
})();

// call the function
window.onload = function() {
  vehicleNamespace.maruthiVehicle("This is Maruthi");
  vehicleNamespace.onVehicleChange(vehicleNamespace.maruthiVehicle, "Selected Maruthi");
};

答案 1 :(得分:0)

function testGlobalNetworkChange(xyz, $) {
    console.log("selectoris " + this.id + ',' + "mode is "
                + xyz+ ',' + "jQuery instance is " + $);
}

    var netowrk= network|| (function($) {
    'use strict';
    return {
        onNetworkChange: onNetworkChange,
        testnetworkChange: testnetworkChange
    };

    function testnetworkChange(mode, $) {
        console.log("AttributeSelector is " + this.id + ','
                    + "mode is "+ mode + ',' + "jQuery instance is " + $);
    }

    function solveFunction(functionName, context) {
        var namespaces = functionName.split(".");
        var func = namespaces.pop();
        for (var i = 0; i < namespaces.length; i++) {
            context = context[namespaces[i]];
        }
        return context[func];
    }

    function OnNetworkChange(selector, functionName, xyz, $) {
        var func = solveFunction(functionName, window);
        $('#' + Selector).change(function(e) {
            func.apply(this, [xyz, $]);
        });
    }
})(jQuery);

//调用您的函数进行测试。 network.onNetWorkChange(参数);