javascript 以函数名称的字符串动态执行函数

Javascript 2020-01-31 阅读 273 评论 0

使用 js,有时候需要动态调用函数:知道函数名称字的符串,能够执行该函数。以下介绍2种方法。

使用 eval 方法

eval 方法是在运行时对脚本进行解释执行,eval 通常用在一些需要动态执行字符串,或将字符串转为 javascript 对象的场景,比如将json字符串转为javascript对象。

使用 eval 方法要注意以下几个问题:

安全性:输入字符串可以通过第三方脚本或用户输入与其他命令一起注入。

调试:调试错误很困难 - 没有行号或明显的故障点。

优化:JavaScript解释器不一定会预先编译代码,因为它可能会更改。尽管解释器的效率日益提高,但几乎可以肯定它的运行速度要比本地代码慢。

但是 eval 确实非常强大,没有经验的开发人员很容易过度使用该命令。因此除非别无选择,否组不要使用 eval 。

// 定义方法
function testFunc(str) {
    console.log(str);
}

调用

var funcName = "testFunc";
var params = "hello world! eval";
var funcCall = funcName + "('" + params + "');";
var ret = eval(funcCall);

亲手试一试 »

使用 window 变量

方法的定义,其实都是对全局变量 window 的扩展,我们在 F12 调试的时候,经常可以看到这种情况。

// 定义方法
function testFunc(str) {
    console.log(str);
}

调用

var funcName = "testFunc";
var params = "hello world! window";
if (window[funcName] != null && typeof window[funcName] === "function") {
    window[funcName](params);
}

亲手试一试 »


总结:可以看出,使用方法名称调用方法,第2种方法比较方便。

最后更新 2020-02-07
MIP.watch('startSearch', function (newVal, oldVal) { if(newVal) { var keyword = MIP.getData('keyword'); console.log(keyword); // 替换当前历史记录,新增 MIP.viewer.open('/s/' + keyword, {replace: true}); setTimeout(function () { MIP.setData({startSearch: false}) }, 1000); } }); MIP.watch('goHome', function (newVal, oldVal) { MIP.viewer.open('/', {replace: false}); });