var arr = []; for(let i=0;i<10;i++) { arr[i]=function(){ console.log(i); } } arr[6]();//输出6
var arr = []; for(var i=0;i<10;i++) { arr[i]=function(){ console.log(i); } } arr[6](); //var声明的i是全局变量,所以i=10,输出10
这种直接动态定义方法并执行的是什么语法规则???
2、
function func(arg) { { let arg; } }
这是什么??代码块??什么作用??
3、
var tmp = new Date(); function f() { console.log(tmp); if (false) { let tmp = 'hello world'; } } f(); // undefined //let声明tmp不会造成变量提升,所以会输出时间 //let不允许在相同作用域内,重复声明同一个变量
function f1() { let n = 5; if (true) { let n = 10; } console.log(n); // 5
//上面的函数有两个代码块,都声明了变量n
,运行后输出 5。这表示外层代码块不受内层代码块的影响。如果两次都使用var
定义变量n
,最后输出的值才是 10。
}
4、常量声明const
const
实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const
只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心
const foo = {}; // 为 foo 添加一个属性,可以成功 foo.prop = 123; foo.prop // 123 // 将 foo 指向另一个对象,就会报错 foo = {}; // TypeError: "foo" is read-only