JavaScript Eval 代码问题

3

我有一个问题,我想在javascript中创建一个“hook”,所以我写了一个小函数来实现。

以下是我的代码:

GoogleMaps.prototype.callUserFunc = function( func, args ){
  eval('GoogleMaps.' + func + '.apply(func, args)');
}

我的问题是我真的不想使用eval()函数,有更好的方法吗?

对于这个初学者问题,我很抱歉,我的JavaScript水平还有待提高。

谢谢!


1
func 是在 GoogleMaps 对象上还是在 .prototype 对象上? - I Hate Lazy
3个回答

4
您可以使用方括号表示法来访问对象的属性。
例如:
var x = {
    someProperty: 5
};

console.log(x["someProperty"]); // => 5
console.log(x.someProperty); // => 5

var y = 'someProperty';
console.log(x[y]); // => 5

x["someProperty"]x.someProperty完全相同。

您可以像这样使用它。

GoogleMaps.prototype.callUserFunc = function( func, args ){
  GoogleMaps[func].apply(func, args);
}

1
apply 中使用 func 没有意义。 - zzzzBov
1
我同意,可能应该是 this。一开始我把它改成了 this,但后来又改回来,以保持其与原始代码在功能上的等效性。虽然 func.apply(func, ... 没有太多意义,但他现有的代码可能依赖于这种行为,这是一个不同的讨论。 - Nathan Wall

3
GoogleMaps.prototype.callUserFunc = function( func, args ){
  GoogleMaps[func].apply(func, args);
  //eval('GoogleMaps.' + func + '.apply(func, args)');
}

1
一个真正的透传函数将返回由该函数返回的值,并在GoogleMaps的上下文中调用。
您的主要问题是不知道数组访问符号可以用于任何对象:
GoogleMaps.prototype.callUserFunc = function(func, args) {
    return GoogleMaps[func].apply(GoogleMaps, args);
};

一般来说,你最好将代码编写为:
GoogleMaps[func](...args...);

但这一切都假设GoogleMaps包含静态可访问的函数,并且没有被用作构造函数来实例化对象。
如果不知道GoogleMaps的使用方式,那么你的传递函数可能应该在callUserFunc被调用的对象实例上执行:
GoogleMaps.prototype.callUserFunc = function(func, args) {
    return this[func].apply(this, args);
};

1
+1 这似乎更合理地将 thisArg 传递给 .apply - I Hate Lazy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接