如何从自身递归调用 $.extend 对象?
How to call $.extend object from itself recursively?
基本上,我正在尝试在 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
不是一个函数,我不确定如何在这里递归调用这个相同的函数。有什么帮助吗?
很容易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;
}
});
因为 提到可能还需要 return(在评论中添加)
您实际提出的问题的答案是为函数命名:
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+已经修复了。
无关,但您可能还需要使用递归调用中的 return 值。如果 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;
}
});
...和一样,你不需要递归:
jQuery(document).ready(function($) {
$.extend({
randomNumber: function(checks) {
var rand;
do {
rand = /* Generate random number */;
} while (checks && $.inArray(rand, checks) !== -1);
return rand;
}
});
基本上,我正在尝试在 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
不是一个函数,我不确定如何在这里递归调用这个相同的函数。有什么帮助吗?
很容易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;
}
});
因为
您实际提出的问题的答案是为函数命名:
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+已经修复了。
无关,但您可能还需要使用递归调用中的 return 值。如果 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;
}
});
...和
jQuery(document).ready(function($) {
$.extend({
randomNumber: function(checks) {
var rand;
do {
rand = /* Generate random number */;
} while (checks && $.inArray(rand, checks) !== -1);
return rand;
}
});