获取不确定的值而不是返回字符串?

时间:2019-09-27 20:14:36

标签: javascript

这是测试代码。我不确定为什么我没有在 console.log(“ hasToken:” + hasToken); 行中返回字符串? 3次尝试失败后,我应该将其退回。没有标记(var XX)的字符串可以正常工作,但是带有标记(var X)的字符串永远不会正确返回该字符串。如果我单步执行代码,我会看到字符串被传回,但是发生了其他事情,我不知道为什么? console.log是否显示hasToken值未定义?我看到应该在哪里返回字符串。Test Code Here

var x = "//tokene.secure.adnxs.com/px?randomnumber=[timeSTAMP]&url=[URl]&newvsreturning=[NEWvsRETURNING]";
var xx = '//xwww.googleadservices.com/pagead/conversion/822232847/?label=_7yrCLe91H4Qj46JiAM&guid=ON&script=0';

var regex = new RegExp("/\\[URL\\]|\\[NEWVSRETURNING\\]|\\[RANDOMNUMBER\\]|\\[TIMESTAMP\\]|\\[CACHEBUSTER\\]/", "i");


function validateTokenRemoval(str) {
cnt = 0;
    function testTokenRemoved(str) {
        if ((regex.test(str))&&(cnt < 2)) {
            //if in here it still has tokens
			cnt++;
            //str = detokenizeTags(imgSrc);
			console.log(cnt + " failed : " + str);
            testTokenRemoved(str);
            
        } else {
            console.log(cnt + " passed : " + str);
            return str;
        }
    };
	
	return testTokenRemoved(str);
};

var hasToken = validateTokenRemoval(x);
var noToken = validateTokenRemoval(xx);
console.log("hasToken : " + hasToken);
console.log("noToken : " + noToken);
您可以看到我在调试过程中的最后一步Return Debug image

1 个答案:

答案 0 :(得分:1)

您必须在if块中的return之前放置testTokenRemoved(str)语句,以返回递归调用的返回值:

var x = "//tokene.secure.adnxs.com/px?randomnumber=[timeSTAMP]&url=[URl]&newvsreturning=[NEWvsRETURNING]";
var xx = '//xwww.googleadservices.com/pagead/conversion/822232847/?label=_7yrCLe91H4Qj46JiAM&amp;guid=ON&amp;script=0';

var regex = new RegExp("/\\[URL\\]|\\[NEWVSRETURNING\\]|\\[RANDOMNUMBER\\]|\\[TIMESTAMP\\]|\\[CACHEBUSTER\\]/", "i");


function validateTokenRemoval(str) {
cnt = 0;
    function testTokenRemoved(str) {
        if ((regex.test(str))&&(cnt < 2)) {
            //if in here it still has tokens
			cnt++;
            //str = detokenizeTags(imgSrc);
			console.log(cnt + " failed : " + str);
            return testTokenRemoved(str);
            
        } else {
            console.log(cnt + " passed : " + str);
            return str;
        }
    };
	
	return testTokenRemoved(str);
};

var hasToken = validateTokenRemoval(x);
var noToken = validateTokenRemoval(xx);
console.log("hasToken : " + hasToken);
console.log("noToken : " + noToken);

好的,但是检查员为什么误导了你?让我们看看里面:

  • 在屏幕截图上,检查器不会在语句(您尝试获取其值)上暂停。您可能会认为,这不是问题,也不是,直到它们在相同范围内。
  • 由于检查人员已将外部暂停了要检查的功能,因此其str的值已不在范围内。
  • 最后,由于在外部作用域中有一个名为str 不同变量 ,因此检查器将向您显示其值,而您想要的值undefined 进行检查。