[英]Call function dynamically in Javascript
我想从像“User.find”这样的字符串动态调用函数。 如果函数存在,脚本将在对象User中调用函数find()。 这是我试过的:
var User = {};
User.find = function(){
return 1;
}
var input = 'User.find';
var some_data_array = {name: 'John Doe'};
var method = input.toString().split('.');
var nameObj = method[0].substring(0,1).toUpperCase() + method[0].substring(1);
var methodToCall = method[1];
nameObj.call(methodToCall, some_data_array);
但它总会回归:
nameObj.call(methodToCall, some_data_array);
TypeError: Object User has no method 'call'
任何想法? 我不能使用窗口,因为它是node.js问题,脚本不在浏览器中执行。
你完全误解了call()
。
call()
,您可以调用一个不同的方法this
。
您希望按名称获取属性:
object[methodName](arg1, arg, ...);
你实际上可以做到这一点。 首先,您需要得到scope
,你的命名空间/功能/对象定义。
例如,在你的代码中我会假设它的window
。
因此,对代码进行一些修改会产生所需的结果:
var User = {};
User.find = function(x){
alert(x);
}
var input = 'User.find';
var some_data_array = {name: 'John Doe'};
var method = input.toString().split('.');
var nameObj = global[method[0]];
var methodToCall = method[1];
nameObj[methodToCall](some_data_array.name);
标记global[]
的使用。 这是它开始的地方。
[编辑] *在nodejs
使用global
而不是window
修改代码。
您要做的是访问全局对象。
这应该工作:
var User = {};
User.find = function(){
return 1;
}
var input = 'User.find';
var some_data_array = {name: 'John Doe'};
var method = input.toString().split('.');
var nameObj = method[0].substring(0,1).toUpperCase() +method[0].substring(1);
var methodToCall = method[1];
"use strict";
var global = (1,eval)("this");
alert(global[nameObj][methodToCall](some_data_array));
有几种方法可以获得理想的结果。 在这种情况下,使用匿名函数非常简单,如下所示,传入objName.name中包含的字符串参数:
var f = function(oName){ if (oName == 'John Doe') { return 1; } }; var objName = {name: 'John Doe'}; console.log( f( objName.name ) );
如果OP更喜欢使用对象的调用方法,则以下代码也足够:
var myObj = { myFunc: function() { if (this.name == 'John Doe') { return 1; } } } var objName = { name: 'John Doe' }; console.log(myObj.myFunc.call(objName));
有几点需要注意。 myObj调用其方法myFunc()传入对象参数objName。 此方法中的目的是读取属性名称 ,因为绑定到对象objName而具有该能力。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.