为什么JavaScript变量在某些站点上正确打印,但在其他站点中未被定义?

问题描述:

为什么JavaScript变量在一些站点上正确打印,但在其他站点中未被定义?为什么JavaScript变量在某些站点上正确打印,但在其他站点中未被定义?

例如,在StackOverflow的网页我可以这样做:

let x = 'y'; 
console.log(x); // Outputs "y". 

但在其他一些网站的网页,就像this Duolingo exerciseconsole.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大一新生,我尽力说出了这个问题。对不起,如果听起来不准确。

+0

很可能在该站点脚本中有'console.log'的搭配,以防止您使用它。像“控制台”。日志=功能(){/ *什么也不做* /}' – charlietfl

+0

为什么会有人这样做? – fayalikt

+0

也许为了更难挖掘存储的数据 – charlietfl

棘手的问题。这是因为它不是相同的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(开发工具)将此输出打印给您,所以您得到未定义的值。