我有一个变量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)");
无论我在变量内部或变量命名空间外的函数放置,我的函数调用都应该触发。
答案 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
,您可以根据要求使用call
或bind
。
请参阅下面的代码段:
/*
* 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(参数);