如何递归调用$ .extend对象?

时间:2015-11-18 08:58:15

标签: jquery recursion extends

基本上,我试图在jQuery上编写一个生成随机数的扩展,但是希望能够不添加已经生成的数字和列表中的数字,所以它不会再添加它们,所以决定使用$.extend

jQuery(document).ready(function ($) {
    $.extend({
        randomNumber: function (checks) {
            var checks = checks || [];
            // Generate random number and store it in rand variable.

            if (checks.length > 0) {
                if ($.inArray(rand, checks) !== -1) {
                    this.randomNumber(checks); // This bit does not work, how to call this function again?
                }
            }
            return rand;
        }
    });

所以this.randomNumber不是一个函数,我不知道如何在这里调用这个相同的函数来递归。有什么帮助吗?

2 个答案:

答案 0 :(得分:3)

您实际问过的问题的答案是给函数命名:

jQuery(document).ready(function($) {
    $.extend({
        randomNumber: function randomNumber(checks) {
        // Here ---------------^
            var checks = checks || [];
            // Generate random number and store it in rand variable.

            if (checks.length > 0)
            {
                if($.inArray(rand, checks) !== -1) {
                     randomNumber(checks);  // <=== No `this`
                }
            }
            return rand;
       }
});

这称为命名函数表达式(NFE),它是一个函数表达式(而不是声明),为函数赋予名称。该名称是函数内的范围,但不在其外部。几年前,Safari和IE都有......使用NFE,但很多很多版本都解决了Safari的问题。 IE8仍然有the IE problem with NFEs,但它不会影响上面的内容,并且已在IE9 +中修复。

不相关,但您可能还需要使用递归调用的返回值。如果没有给你,则不需要创建checks数组:

jQuery(document).ready(function($) {
    $.extend({
        randomNumber: function randomNumber(checks) {
            var rand = /* Generate random number */;

            if (checks && $.inArray(rand, checks) !== -1) {
                 rand = randomNumber(checks);
            }
            return rand;
       }
});

...和Yeldar pointed out一样,你不需要递归:

jQuery(document).ready(function($) {
    $.extend({
        randomNumber: function(checks) {
            var rand;

            do {
                rand = /* Generate random number */;
            } while (checks && $.inArray(rand, checks) !== -1);

            return rand;
       }
});

答案 1 :(得分:1)

非常容易use this

jQuery(document).ready(function($) {
    $.extend({
        randomNumber: function randomNumber(checks) { // named function
            var checks = checks || [];
            // Generate random number and store it in rand variable.

            if (checks.length > 0)
            {
                if($.inArray(rand, checks) !== -1) {
                     /*return*/ randomNumber(checks); // named function is available here, maybe return the value??
                }
            }
            return rand;
       }
});

@Crowder's answer所述,也可能需要返回(在评论中添加)