声明变量 ES3.1声明变量方式 //var num = 100(直接挂再window上。容易造成全局污染) ES6声明变量方式 //let num = 100(不会造成全局污染) let不允许重复声明 let不会有声明提前 ? 在人为效果上是没有声明提前,而实则将数据保存到临时性死区中
Cannot access 'num' before initialization //出现这种错误时表式将数据保存到临时性死区块级作用域 ES3.1局部作用域
(function(){ var num = 100;//通过匿名函数创建局部作用域 })()ES6块级作用域
{ var num = 100;//与局部zuo'yong }常量声明 const不允许重复声明 const不会有声明提前 且常量不允许改变值 ?
//实则是不允许改变内存空间的地址。 const obj={}; obj.name = "jack" console.log(obj)//{name:jack} //const声明和赋值必须一次性完成,并且后期不允许改变存储空间地址 const abc; abc = 123; console.log(abc)//报错,碰到以下类似的问题需要注意自己的let是否用的到位; 如果不到位就会出现解决了一个问题还会产生其他的新问题。
//控制台有什么内容,怎样改动才可以输出0123456789 var arr = []; for(var i = 0;i<10;i++){ arr[i] = function(){ console.log(i); } } arr[0]() arr[1]() arr[2]() arr[3]() arr[4]() arr[5]() arr[6]() arr[7]() arr[8]() arr[9]() console.log(i) //实际上这个问题分成两问 //1.是输出数组0-9这个比较简单,在开始循环中将var i 改成 let i 即可 //2.输出这i这个才是个掉坑的地方,当你将开始循环中将var i 改成 let i之后{}形成了一个块级作用域, //再想输出i是就会报错 //解决方法添加立即执行函数 var arr = []; for(var i = 0;i<10;i++){ (function(i){ arr[i] = function(){ console.log(i); } })(i) } arr[0]() arr[1]() arr[2]() arr[3]() arr[4]() arr[5]() arr[6]() arr[7]() arr[8]() arr[9]() console.log(i)