为何使用console.log会改变JavaScript函数的输出值?
为什么添加console.log会改变JavaScript函数的输出结果?
你原本认为console.log不会改变函数输出,但实际添加后结果完全不同:
添加console.log的函数:
function S(e) { for (var t = '', n = e.charCodeAt(0), i = 1; i < e.length; ++i) console.log(i, n ); t += String.fromCharCode(e.charCodeAt(i) ^ ((i + n) & 127)); return t; } S(":h_OWO4a'16*4g.&8kn") // 返回 'M'
移除console.log后的函数:
function S(e) { for (var t = '', n = e.charCodeAt(0), i = 1; i < e.length; ++i) t += String.fromCharCode(e.charCodeAt(i) ^ ((i + n) & 127)); return t; } S(":h_OWO4a'16*4g.&8kn") // 返回 'Script error for "'
问题根源:缩进导致的for循环逻辑错误
JavaScript里,for循环如果没有用大括号{}包裹代码块,只会执行紧跟在循环条件后的第一行语句,剩下的语句和循环完全无关。
- 第一个函数中,
console.log(i, n );是紧跟for的语句,所以每次循环只执行这一行;而下面的t += ...不在循环体内,只会在循环结束后执行一次。此时循环结束时i等于e.length,e.charCodeAt(i)返回undefined,经过异或运算后得到对应字符'M',所以最终返回单个字符。 - 第二个函数中,
t += ...直接紧跟for,属于循环体内容,每次循环都会执行,所以会逐个处理输入字符串的每个字符,最终得到完整的解密结果'Script error for "'。
本质就是加console.log时的缩进错误,把原本属于循环体的代码踢出了循环,导致函数逻辑彻底改变。
内容的提问来源于stack exchange,提问作者Brain -
相关产品推荐
相关产品推荐

