【问题标题】:Getting Undefined Value Instead of String Returned? [duplicate]获取未定义的值而不是返回的字符串? [复制]
【发布时间】:2020-01-28 03:41:05
【问题描述】:

这是测试代码。我不确定为什么没有在 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 testTokenRemoved(....)
  • 这是设计使然。只有失败 3 次或通过才会返回。

标签: javascript


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回复。我仍然很困惑。第一次通过的没有令牌(var xx)的字符串按预期返回。在 testTokenRemoved 函数中通过检查的带有标记的字符串一旦到达最终尝试并被返回,为什么它不起作用?
  • 为了清楚起见,我更改了子例程参数的名称。我重新测试了,仍然看到字符串被传回,但由于某种原因,函数没有将值返回给变量 image ==> imgur.com/MVQy4CW
  • @MichaelJohns 当然,因为您检查的是 str 变量,而不是 testTokenRemoved 的返回值。用鼠标选择完整的testTokenRemoved(str) 表达式并将鼠标悬停在它上面。您将看到返回的值与稍后记录的完全相同。
  • 所以问题是我进行递归的方式,但我不明白为什么我看到函数返回的值?
  • @MichaelJohns 完全正确。
猜你喜欢
  • 2017-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
  • 2019-05-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多