理解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并没有过时——它们是一种非常常见的模式,有许多有用的用途。有些人可能会说,如果您使用的是模块系统,它们有些过时,这在某种程度上是正确的,但不完全是正确的