Sre*_* SA 5 javascript let ecmascript-6
我听说使用全局变量在JavaScript中很糟糕.由于let是块作用域,我可以在包含所有其他函数的块中使用它,并以与全局变量类似的方式使用它吗?
{
var b = 10;
let c = 20;
function foo(){
return c;
}
}
Run Code Online (Sandbox Code Playgroud)
是的,您可以提出警告(见下文).在您的示例中,b是全局的,但c不是.
请注意,foo该代码是处于松散模式的全局代码,因此如果您要这样做,请使用"use strict";代码顶部.
另请注意,并非所有浏览器都正确支持ES2015语义let,块中的函数声明等.
要支持不兼容的旧版浏览器,您可以使用旧方法:范围函数:
(function() {
var b = 10;
var c = 20;
function foo(){
return c;
}
})();
Run Code Online (Sandbox Code Playgroud)
在那里,b并且c都是当地的,不是全球性的,即使我用var他们.
当然,支持旧版浏览器的另一个选择是使用像Babel这样的转换器,并让它生成与ES5兼容的代码(并包含必要的polyfill).对于像IE8这样真正过时的浏览器(它仍然可以在某种程度上存活下来),您可能需要它来输出ES3代码(并且您需要更多的polyfill).
(严格的模式对于其他事情来说仍然很方便,即使有一个范围界定功能,例如取消隐含全局的恐怖 [披露:这是我贫血的小博客上的帖子].)
在这两种情况下,一个作用域或作用域函数,你最终会得到对你的代码有效全局的变量(在作用域/函数内部),但实际上不是全局变量,所以没有一些问题是真的全局变量,例如以意想不到的方式与内置name函数冲突(例如在浏览器的全局范围内,即使你为它分配一个数字或函数,它总是一个字符串 - 因为它window.name是窗口的名称).