js中申明变量需注意
2018-06-20 本文已影响14人
Beauty_Beast
申明:本文是js系列笔记之一,有不正确的地方请尽管指出,大家相互学习,共同进步;
js语言分严格模式strict与非严格模式,
问题产生:在非严格模式下, 如果某个变量被初始化,而没有事先声明;那么该变量会自动被添加到全局作用域中;看下边的现象:

非常出乎意料的结果
再试试下边:

想想为什么会这样:再试试下边

看到这里相信大家都明白了,开始所述,必须有一个前提,那么就是方法被调用过,或者该变量被使用过,为什么会这样,我猜测大概是这样得方法在未被调用之时,只是声明了,方法内部,js线程是不去管的,只有在被调用时,线程执行到方法中,该变量被使用,才会被js添加到全局作用域中;
前边提到了,严格模式;上边所说的结果都是在非严格模式下才会出现的结果,在严格模式下,没有被申明的变量,突然冒出来,会直接暴出 未被定义的error;顺便说下,严格模式下,js不让使用with语句的,,这也证明了我在前边对with的理解,js本身都不建议使用with语句;

js有太多的灵活性与不确定性,这也导致了其 缺陷;