tmp,事实上,函数f无论如何变量tmp都会被创建,在预编译阶段,javaScript引擎会将上面的f函数修改成下面这样
函数f执行后,输出结果为undefined,原因就是在于,当使用函数声明时,变量会提升到运行坏境的顶部...,但是循环结束后,它并没有消失,释放,而是泄露成了全局变量,这样会造成全局变量的污染
解决办法:
使用let定义变量的话,那么for循环的计数器变量i,只在for循环内有效
如下示例所示
var arr...,在第一次循环中,i是0,迭代执行成功,然后执行i++,因为这条语句试图修改常量,因此抛出错误,如果后续循环不会修改该常量,那么可以使用const声明
比如:for-on或for-of循环中使用const...,指向一个对象,不可变的只是这个地址,不能把foo指向另一个地址,但对象本身是可变的,所以依然可以为其添加新的属性
07
关于全局块作用域的绑定
当var,和function被用于全局作用域时,它会创建一个新的全局变量对象作为全局对象...使用const定义初始化值变量,那么就会报错,因为常量不能被改变
而for..in,fo..of循环中,let,const都会每次迭代创建一个新的绑定,从而使循环体内创建的函数可以访问到相应迭代的值,而非最后一次迭代后的值