如何向Javascript函数发送条件测试,而不仅仅是它';结果如何?
我曾想过制作一个小的jQuery插件,但我不知道如何在不依赖如何向Javascript函数发送条件测试,而不仅仅是它';结果如何?,javascript,jquery,Javascript,Jquery,我曾想过制作一个小的jQuery插件,但我不知道如何在不依赖eval的情况下实现它 代码如下: var testMe = 1; $.extend({ once : function( condition, duration, callback) { window[ "once" ] = window.setTimeout(function() {
eval
的情况下实现它
代码如下:
var testMe = 1;
$.extend({
once : function( condition, duration, callback) {
window[ "once" ] = window.setTimeout(function() {
if ( condition )
{
callback.apply();
window.clearTimeout( window[ "once" ] );
} else {
window[ "once" ] = window.setTimeout( arguments.callee, duration * 1000 );
}
}, duration * 1000 );
}
});
$.once(testMe == 2, 5, function() {
alert("Match!");
});
它看起来像是在调用$.once()
时,然后计算第一个参数,此时仅将其值发送到条件参数。我找到的唯一方法是将其作为字符串发送:
$。一次(“testMe==2”…
并使用if(eval(condition))
使用eval
还有其他方法吗
多谢各位
编辑:这是插件的最终版本:
var testOne = 1,
testTwo = 1;
$.extend({
once : function( name, conditionFn, duration, callback) {
if ( typeof duration == "function" )
{
callback = duration;
duration = 5;
}
window[ "once" + name ] = window.setInterval(function() {
if ( conditionFn() )
{
callback();
window.clearInterval( window[ "once" + name ] );
}
}, duration * 1000 );
}
});
//Examples
$.once("testOne", function() {
return testOne == 2
}, 2, function() {
alert("testOne == 1");
});
$.once("testTwo", function() {
return testTwo == 2
}, 2, function() {
alert("testTwo == 1");
});
发送一个返回比较结果的函数:
var testMe = 1;
$.extend({
// receive the function
once : function( conditionFn, duration, callback) {
window[ "once" ] = window.setTimeout(function() {
// execute the function
if ( conditionFn() )
{
callback.apply();
window.clearTimeout( window[ "once" ] );
} else {
window[ "once" ] = window.setTimeout( arguments.callee, duration * 1000 );
}
}, duration * 1000 );
}
});
// send a function
$.once(function(){return testMe == 2;}, 5, function() {
alert("Match!");
});
发送一个返回比较结果的函数:
var testMe = 1;
$.extend({
// receive the function
once : function( conditionFn, duration, callback) {
window[ "once" ] = window.setTimeout(function() {
// execute the function
if ( conditionFn() )
{
callback.apply();
window.clearTimeout( window[ "once" ] );
} else {
window[ "once" ] = window.setTimeout( arguments.callee, duration * 1000 );
}
}, duration * 1000 );
}
});
// send a function
$.once(function(){return testMe == 2;}, 5, function() {
alert("Match!");
});
您是正确的;参数是经过计算然后传递的。我不建议使用
eval
,除非您确实知道自己在做什么,并且有充分的理由这样做
相反,将一个谓词(一个返回布尔值的函数)传递给插件。每次要执行检查时,调用该函数:
var-testMe=1
$.extend({
once : function(predicate, duration, callback) {
window.once = window.setInterval(function() {
if (predicate()) {
window.clearInterval(window.once);
callback();
}
}, duration * 1000);
}
});
$.once(function () { return testMe == 2; }, 5, function() {
alert("Match!");
});
N.B.我用一个自取消的
setInterval()
替换了重复的setTimeout
调用。另外,您用callback.apply()
调用了回调
,但是没有理由这样做。您可以直接用调用它()
,正如上面的代码所做的那样。您是正确的;参数将被计算并传递。除非您确实知道自己在做什么,并且有充分的理由这样做,否则我不建议使用eval
相反,将一个谓词(一个返回布尔值的函数)传递给插件。每次要执行检查时,调用该函数:
var-testMe=1
$.extend({
once : function(predicate, duration, callback) {
window.once = window.setInterval(function() {
if (predicate()) {
window.clearInterval(window.once);
callback();
}
}, duration * 1000);
}
});
$.once(function () { return testMe == 2; }, 5, function() {
alert("Match!");
});
N.B.我用一个自取消的
setInterval()
替换了您重复的setTimeout
调用。另外,您用callback.apply()
调用回调
,但是没有理由这样做。您可以像上面的代码那样直接用()
调用它。您的意思是“如果”(条件())“?这很有效!但我不觉得让用户传递一个匿名函数将条件返回给函数非常“用户友好”。但我想这是我唯一的解决方案。你的意思是“如果(条件())”?这很有效!但我觉得它不是很“用户友好”必须要求用户传递一个匿名函数,该函数向函数返回一个条件。但我想这是我唯一的解决方案。