我试图在没有循环的情况下添加未知数量的参数。这是我到目前为止所做的。
var add = function add() {
if (!arguments.length) {
return 0;
} else {
var args = [].slice.call(arguments, 0);
console.log(args[0], arguments);
args.splice(0, 1);
return args[0] + add.apply(this, args); //needtoreadaboutapply
}
};
这是我调用add(3,4,5)时得到的输出。
所以我做错了什么以及如何在浏览器控制台中调试这样的递归调用?
3 [3, 4, 5]
4 [4, 5]
5 [5]
NaN
答案 0 :(得分:3)
您正从参数中删除一个元素并访问它。因此,在处理最后一个参数时,该操作将导致问题。当您删除最后一个参数时,数组将为[]
为空,此时如果您访问arg[0]
将提供undefined
。 undefined + number = NaN
。
尝试使用已删除的号码,而不是从阵列中访问它,
var add = function add() {
if (!arguments.length) {
return 0;
} else {
var args = [].slice.call(arguments, 0);
var spliced = args.splice(0, 1);
console.log(args[0], arguments);
return spliced[0] + add.apply(this, args); //needtoreadaboutapply
}
};
答案 1 :(得分:1)
如果你不习惯使用递归函数,你可能想要研究使用.reduce()
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
DELIMITER $$
DROP PROCEDURE IF EXISTS `appclient.P_GetClientList`$$
CREATE PROCEDURE `appclient.P_GetClientList`(
IN V_ReportId INT,
IN V_PagePerRecordN INT,
IN V_PageN INT,
IN V_Condition VARCHAR (4000),
IN V_SortColIndex VARCHAR (10),
IN V_SortOrder VARCHAR (10),
IN V_Param1 VARCHAR (500),
IN V_Param2 VARCHAR (500),
IN V_Param3 VARCHAR (500),
IN V_Param4 VARCHAR (500),
IN V_Param5 VARCHAR (500),
IN V_Param6 VARCHAR (500),
IN V_Param7 VARCHAR (500),
IN V_Param8 VARCHAR (500),
IN V_Param9 VARCHAR (500),
IN V_Param10 VARCHAR (500),
IN V_IsPdf INT,
OUT V_TotalPages INT,
OUT V_TotalRecords INT,
OUT V_TabCountDetails VARCHAR (500)
)
BEGIN
DECLARE V_Query VARCHAR (4000) ;
DECLARE V_OrderBy NVARCHAR (500) ;
DECLARE V_ClientListId SMALLINT ;
DECLARE V_Logo NVARCHAR (50) ;
DECLARE V_Status VARCHAR (10) ;
DECLARE V_ClientId SMALLINT ;
DECLARE V_IsManDocsReq BIT ;
DECLARE V_IsApproveLink BIT ;
DECLARE V_ThemeId BIT ;
DECLARE V_IsActive BIT ;
DECLARE V_IsThemeLogoUploded BIT ;
DECLARE V_IsRegDocsUploaded BIT ;
DECLARE V_IsOnlinePayment BIT ;
DECLARE V_IsConfigurationDone BIT ;
DECLARE V_IsClientBidTermConfigured BIT ;
DECLARE V_IsClientBidTermGridLink BIT ;
DECLARE V_IsClientBidTermCreateLink BIT ;
DECLARE V_IsCPPPRequired TINYINT ;
DECLARE V_CPPPClientCount TINYINT ;
DECLARE V_State BOOLEAN DEFAULT FALSE;
IF(V_SortColIndex != '' AND V_SortColIndex IS NOT NULL AND V_SortOrder != '' AND V_SortOrder IS NOT NULL) THEN
SELECT V_OrderBy = CONCAT(RSCD.selectFieldName, ' ', V_SortOrder)
FROM `appreport.Tbl_ReportSearchColumnDetail` RSCD
WHERE RSCD.reportId = V_ReportId AND RSCD.columnId = V_SortColIndex;
END IF;
SET @V_Query = CONCAT('SELECT COUNT(1) into @V_TotalRecords FROM `appclient.tbl_Client` CM INNER JOIN `appclient.tbl_Department` DM ON CM.deptId = DM.deptId
WHERE 1 = 1 ',V_Condition);
SELECT @V_Query;
SELECT @V_TotalRecords;
PREPARE stm FROM @V_Query;
EXECUTE stm USING @V_TotalRecords;
DEALLOCATE PREPARE stm;
SET @V_Query1 = CONCAT('SELECT A.clientId, A.domainName, A.deptName, A.isManDocsReq, A.themeId, A.logo, A.isOnlinePayment,0 AS isApproveLink, 0 AS isClientBidTermCreateLink, 0 AS isClientBidTermGridLink, '''' AS cstatus, A.isActive,A.isCPPPRequired,A.cppCount
FROM (SELECT @row_number:=@row_number+1 AS row_number, CM.clientId, CM.domainName, DM.deptName,CM.isManDocsReq, CM.themeId, CM.logo, CM.isOnlinePayment, CM.isActive,CM.isCPPPRequired,CPC.cppCount
FROM `appclient.tbl_Client` CM
INNER JOIN `appclient.tbl_Department` DM ON CM.deptId = DM.deptId
LEFT OUTER JOIN (SELECT clientId,COUNT(clientId) cppCount FROM `appclient.tbl_ClientCPPPConfig` GROUP BY clientId) CPC ON CPC.clientId = CM.clientId,(SELECT @row_number:=0) AS t
WHERE 1 = 1', V_Condition,') AS A
WHERE ',@row_number, ' BETWEEN ' ,CAST((@V_PageN - 1) * @V_PagePerRecordN + 1 AS CHAR) ,' AND ' ,CAST(@V_PageN * @V_PagePerRecordN AS CHAR)) ;
SELECT @V_Query1;
/*INSERT INTO `ttbl_ClientList` (
clientId,domainName,deptName,isManDocsReq,themeId,logo,isOnlinePayment,isApproveLink,isClientBidTermCreateLink,isClientBidTermGridLink,cstatus,
isActive,isCPPPRequired,cppCount
)
*/
PREPARE stm FROM @V_Query1 ;
EXECUTE stm;
DEALLOCATE PREPARE stm; --
Loop_lable: WHILE (@V_Query1) DO
SET V_IsApproveLink = 0;
SET V_IsThemeLogoUploded = 0;
SET V_IsConfigurationDone = 0;
SET V_IsRegDocsUploaded = 0;
SET V_IsClientBidTermConfigured = 0;
SET V_IsClientBidTermGridLink = 0;
SET V_IsClientBidTermCreateLink = 0;
SET V_ClientId = 0;
SET V_IsCPPPRequired = 0;
SET V_CPPPClientCount = 0;
SELECT V_ClientId = clientId, V_IsManDocsReq = isManDocsReq, V_ThemeId = themeId, V_Logo = logo,
V_IsOnlinePayment = isOnlinePayment, V_IsActive = isActive, V_IsCPPPRequired = isCPPPRequired
FROM ttbl_ClientList WHERE clientListId = V_ClientListId;
/*
IF (@ROWCOUNT = 0) THEN
LEAVE Loop_lable;
END IF;
*/
IF (V_ThemeId != '' AND V_Logo != '' AND V_Logo != 'abc') THEN /* Theme and Logo */
SET V_IsThemeLogoUploded = 1;
END IF;
IF ((SELECT COUNT(1)
FROM appclient.tbl_ClientEventType CET INNER JOIN appmaster.tbl_Field MF ON CET.eventTypeId = MF.eventTypeId AND MF.isActive = 1
WHERE CET.clientId = V_ClientId AND CET.isActive = 1)
= (SELECT COUNT(1) FROM appclient.tbl_CustomParameter CP
INNER JOIN appclient.tbl_ClientEventType CET ON CP.eventTypeId = CET.eventTypeId AND CP.clientId=CET.clientId AND CET.isActive=1
WHERE CP.clientId = V_ClientId)) THEN /* Default Configuration */
SET V_IsConfigurationDone = 1;
END IF;
IF (V_IsManDocsReq = 1) THEN /* Bidder Registration Docs Required */
IF EXISTS (SELECT 1 FROM appclient.tbl_ClientRegDoc WHERE clientId = V_ClientId AND isActive = 1) THEN /* Mandatory Registration Docs Defined */
SET V_IsRegDocsUploaded = 1;
END IF;
ELSE
SET V_IsRegDocsUploaded = 1;
END IF;
/* Client bid term required */
IF ((SELECT COUNT(1)
FROM `appclient.tbl_ClientEventType` CET
LEFT OUTER JOIN `appclient.tbl_ClientBidTerm` CBT ON CET.clientId = CBT.clientId AND CET.eventTypeId = CBT.eventTypeId AND CBT.isActive = 1
WHERE CET.clientId = V_ClientId AND CET.isActive = 1 AND CBT.clientBidTermId IS NULL) = 0) THEN
SET V_IsClientBidTermGridLink = 1;
END IF;
IF ((SELECT COUNT(1)
FROM `appclient.tbl_ClientEventType` CET INNER JOIN appclient.tbl_ClientLanguage CL ON CET.clientId = CL.clientId AND CL.isActive = 1
WHERE CET.clientId = V_ClientId AND CET.isActive = 1)
= (SELECT COUNT(1) FROM `appclient.tbl_ClientBidTerm` CBT WHERE CBT.clientId = V_ClientId AND CBT.isActive = 1)) THEN
SET V_IsClientBidTermConfigured = 1;
ELSE
SET V_IsClientBidTermCreateLink = 1;
END IF;
IF (V_IsThemeLogoUploded = 1 AND V_IsConfigurationDone = 1 AND V_IsRegDocsUploaded = 1 AND V_IsClientBidTermConfigured = 1) THEN
SET V_IsApproveLink = 1;
END IF;
IF (V_IsActive = 1) THEN
SET V_IsApproveLink = 0;
SET V_Status = 'Approved';
ELSE
SET V_Status = 'Pending';
END IF;
UPDATE `ttbl_ClientList`
SET isApproveLink = V_IsApproveLink, isClientBidTermCreateLink = V_IsClientBidTermCreateLink,
isClientBidTermGridLink = V_IsClientBidTermGridLink, isOnlinePayment = V_IsOnlinePayment,
cstatus = V_Status
WHERE clientListId = V_ClientListId;
SET V_ClientListId = V_ClientListId + 1;
END WHILE;
SELECT clientId AS FieldValue1, CONCAT( domainName ,' </A> <BR>', deptName) AS FieldValue2,
deptName AS FieldValue3, isManDocsReq AS FieldValue4,CASE WHEN isCPPPRequired = 0 THEN isApproveLink WHEN (isCPPPRequired = 1 AND cppCount = 1) THEN isApproveLink ELSE 0 END AS FieldValue5, cstatus AS FieldValue6,
isClientBidTermCreateLink AS FieldValue7, isClientBidTermGridLink AS FieldValue8, isOnlinePayment AS FieldValue9,
CASE WHEN (isCPPPRequired = 1) THEN 1 ELSE 0 END AS FieldValue11
FROM `ttbl_ClientList`;
SET V_TotalPages = CEILING( V_TotalRecords / V_PagePerRecordN);
SET V_TabCountDetails = '';
END$$
DELIMITER ;
答案 2 :(得分:0)
将return args[0]+add.apply(this,args);
更改为return arguments[0]+ add.apply(this,args)
在这个问题中,我首先拼错了args,然后引用了args [0]。