Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解javascript中的变量阴影?_Javascript - Fatal编程技术网

理解javascript中的变量阴影?

理解javascript中的变量阴影?,javascript,Javascript,我创建了一个加密对象,如下所示: var crypto={ 加密:函数{ } }; 加密(“cat”)通常,是的,稍后声明的变量(使用var)将简单地用相同的名称覆盖先前声明的var。不同之处在于,在顶层用var声明的变量分配给window属性,而window.crypto是一个带有getter但没有setter的属性: console.log( getOwnPropertyDescriptor(窗口“crypto”) );谢谢。我仍然不明白为什么用let而不是var解决了这个问题。即使使用

我创建了一个加密对象,如下所示:

var crypto={
加密:函数{
}
};
加密(“cat”)通常,是的,稍后声明的变量(使用
var
)将简单地用相同的名称覆盖先前声明的
var
。不同之处在于,在顶层用
var
声明的变量分配给
window
属性,而
window.crypto
是一个带有getter但没有setter的属性:

console.log(
getOwnPropertyDescriptor(窗口“crypto”)

);谢谢。我仍然不明白为什么用let而不是var解决了这个问题。即使使用let,我们仍然处于顶级,为什么它与窗口加密不冲突呢。我知道let是块作用域,var是函数作用域。我们是否可以假设我们编写的javascript代码位于块{}内,以便任何let声明都在这个范围内。谢谢你的帮助!这就是
const
let
的工作方式-它们不分配给
窗口上的属性,不像
var
,即使是在顶层。我明白了。var也过时了。我们应该一直使用let吗?你怎么说?似乎随着let的引入,iffe也过时了。你的意见是什么?是的,我肯定会考虑<代码> var >代码>过时-几乎没有理由在现代代码中使用它。它有太多的陷阱。如果您需要与过时的浏览器兼容,请使用Babel之类的transpiler向下传输到ES5。不过,IIFE并没有过时——它们是一种非常常见的模式,有许多有用的用途。有些人可能会说,如果您使用的是模块系统,它们有些过时,这在某种程度上是正确的,但不完全是正确的