使用点表示法中的对象字符串调用javascript函数
Calling javascript function with an objectstring in dot notation
假设我有字符串:
var string = "function";
带
window[string];
我可以调用一个名为"function"的函数。
但是,当我有:
var string2 = "function.method.weHaveTogoDeeper";
它应该调用
window["function"]["method"]["weHaveTogoDeeper"]
我做不到:
window[string2]
在这种情况下。我不知道字符串中"."的数字,所以我需要一些例程。
您可以使用String.split
方法在.
中拆分字符串:
var string2 = "function.method.weHaveTogoDeeper";
var methods = string2.split(".");
在本示例中,methods
将是数组["function","method","weHaveTogoDeeper"]
。现在,您应该能够对这个数组进行简单的迭代,对上一个数组的结果调用每个函数。
编辑
我脑海中的迭代是这样的:
var result = window;
for(var i in methods) {
result = result[methods[i]];
}
在您的示例中,result
现在应该与保持相同的输出
window["function"]["method"]["weHaveTogoDeeper"]
function index(x,i) {return x[i]}
string2.split('.').reduce(index, window);
edit:当然,如果您从函数名称的字符串中调用函数,您可能会做一些不雅的事情,这会让人反感,尤其是在协作编码设置中。我能想到的唯一合理的用例是编写一个测试框架,尽管可能还有更多的用例。因此,在遵循这个答案时请谨慎;应该使用数组,或者理想情况下使用直接引用。
我不久前写了一个:
function RecursiveMapper(handlerName, stack) {
// check if empty string
if(!handlerName || handlerName === '' || (handlerName.replace(/'s/g,'') === '')) return null;
var buf = handlerName.split('.');
stack = stack || window;
return (buf.length === 1) ? stack[buf[0]] : this.RecursiveMapper(buf.slice(1).join('.'), stack[buf[0]]);
}
这样称呼它:RecursiveMapper(window[string2]);
此函数还检查函数是否首先在window
作用域中定义,并返回找到的全局函数。
相关文章:
- 字符串对象类型或基元类型也是如此
- Javascript-如何从字符串/对象引用回调
- JavaScript,字符串/对象操作的例外
- 如何在require中传递字符串/对象
- 字符串对象比较总是返回false
- 对字符串对象调用 .localeCompare 与构造特制的 Intl.Collator 对象之间的性能差异
- 将变量打印到控制台时出现意外字符串:[对象窗口]
- 如何使用javascript在字符串对象中添加原型
- 如何在 JavaScript 中设置/更新字符串对象的值
- jQuery:在 $.each 中从字符串类型转换为字符串对象
- 将属性添加到字符串对象时出现问题
- 从字符串对象中删除第一个出现的字母
- 如何正确地将JQuery函数从表单的输入标记中检索到的这些字符串对象转换为数字
- 转换“;字符串对象“;到对象
- Javascript中字符串对象到字符串原语的转换
- JavaScript符号类型:(非字符串对象键)
- 正在重新定义字符串对象中的长度属性
- 带有字符串对象的jQuery选择器不起作用
- 如何在javascript中将JSON字符串对象打印为下拉列表
- 将日期字符串对象转换为其他格式