如何向Javascript函数发送条件测试,而不仅仅是它';结果如何?

如何向Javascript函数发送条件测试,而不仅仅是它';结果如何?,javascript,jquery,Javascript,Jquery,我曾想过制作一个小的jQuery插件,但我不知道如何在不依赖eval的情况下实现它 代码如下: var testMe = 1; $.extend({ once : function( condition, duration, callback) { window[ "once" ] = window.setTimeout(function() {

我曾想过制作一个小的jQuery插件,但我不知道如何在不依赖
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()
调用
回调
,但是没有理由这样做。您可以像上面的代码那样直接用
()
调用它。

您的意思是“如果”(条件())“?这很有效!但我不觉得让用户传递一个匿名函数将条件返回给函数非常“用户友好”。但我想这是我唯一的解决方案。你的意思是“如果(条件())”?这很有效!但我觉得它不是很“用户友好”必须要求用户传递一个匿名函数,该函数向函数返回一个条件。但我想这是我唯一的解决方案。