为什么JavaScript变量在某些站点上正确打印,但在其他站点中未被定义?
问题描述:
为什么JavaScript变量在一些站点上正确打印,但在其他站点中未被定义?为什么JavaScript变量在某些站点上正确打印,但在其他站点中未被定义?
例如,在StackOverflow的网页我可以这样做:
let x = 'y';
console.log(x); // Outputs "y".
但在其他一些网站的网页,就像this Duolingo exercise的console.log
检查将失败:
let x = 'y';
console.log(x); // Outputs "Undefined".
从我”至今我读过的内容与范围有关。但是,我不清楚什么类型的范围,因为几乎总是我知道JavaScript中只有2个示波器:全局(文档向下)和函数(也涵盖函数的子函数)。
这似乎做第三范围,窗口(窗口 - 向下),但我不清楚为什么我devtool控制台不会自动覆盖这个以及,上述文件和功能,在这些像Duolingo这样的网页,我遇到了这个问题。
无论如何要声明变量,我试着把我的变量放在IIFEs中。它没有帮助,所以我仍然在我遇到这个问题的网站中得到“未定义”的变量。例如:
的StackOverflow:
(()=>{
let x = 'y';
console.log(x);
})(); // Outputs "y".
听歌练习:
(()=>{
let x = 'y';
console.log(x);
})(); // Outputs "undefined".
为什么有的网站输出未定义的声明时变量,什么是最好的方法,你会说,以应付呢?
请在你的回答中解释为什么只有在某些网站而不是其他网站,为什么我的IIFE尝试失败,如果我使用这个IIFE为我的变量任意设置一个范围。
作为一名JS大一新生,我尽力说出了这个问题。对不起,如果听起来不准确。
答
棘手的问题。这是因为它不是相同的console.log。当你在计算器如果打印
console.log
你得到这样的事情
ƒ log() { [native code] }
我没有调用(括号)打印功能定义,因为我想看到的定义。如果你在听歌同样的事情,你得到
ƒ(){for(var e=[],n=0;n<arguments.length;n++)e[n]=arguments[n];(vt()||window.verbose)&&Function.prototype.apply.apply(t,[console,e])}
这意味着该网页覆盖的console.log的定义是在JavaScript中有效。由于JS中的每个函数默认返回未定义,并且REPL(开发工具)将此输出打印给您,所以您得到未定义的值。
很可能在该站点脚本中有'console.log'的搭配,以防止您使用它。像“控制台”。日志=功能(){/ *什么也不做* /}' – charlietfl
为什么会有人这样做? – fayalikt
也许为了更难挖掘存储的数据 – charlietfl