繁体   English   中英

在Javascript中动态调用函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM