我正在尝试创建一个比较对象中键值的函数。我想使用'this'关键字来引用键值,但是值可能是原语而不是对象。为此,我使用eval来评估if语句中键的值。
所以我可以做这样很酷的事情......
bar.find({ key: 'this - 2 === 5' });
bar.find({ key2: 'this.length === 11' });
// In order to do this I have a function similar to this
// constructor function for my object
function foo(arg){
this.key = 5;
this.key2 = 'hello world';
};
// method to find if matching key values exist
foo.prototype.find = function(args){
// variable to hold the contents of the anonymous function
var compare;
// create an anonymous function to shield the eval from executing
// potentially harmful code, by overwriting the document and window.
(function(window, document){
compare = function(comparison){
if ( eval( comparison ) )
return true;
else
return false;
};
})();
// Loop over the keys in args
for( i in args ){
if ( this[i] ) {
// call the compare function bound to the scope of the
// keys value
return compare.call(this[i], args[i]);
}
else {
return false;
};
};
};
// Create an new foo object
bar = new foo;
// test it, should return true
bar.find({key: 'this - 2 === 3', key2: 'this.length === 11'});
>> false // 5 - 2 === 3
>> false // 'hello world'.length === 11
我遇到的问题不是代码不起作用。完全===运算符不起作用,但==运算符工作正常。
如果我这样做
bar.find({key: 'this - 2 == 3', key2: 'this.length == 11'});
>> true // 5 - 2 == 3
>> true // 'hello world'.length == 11
这是eval正在做的事情,导致类型不匹配吗?
或者,如果有人有更好的选择来实现同样的目标。
答案 0 :(得分:0)
第8版的Worksforme。我不知道eval会如何搞乱这些类型。
通常不需要使用eval,它很慢,也许比传递函数更简洁,但我仍然更喜欢函数,所以你可以将参数更改为bar.find({key: function () { return this - 2 === 3 }, key2: function () { return this.length === 11 })
。
答案 1 :(得分:0)
不要使用eval
它会调用全局范围内的所有内容,因此this
的值将不正确。
直接使用回调函数,因此您的代码看起来更像:
bar.find({
key: function() { return this - 2 === 3; },
key2: function() { return this.length === 11; }
});