以下执行的结果是什么?为什么
function test(){
massage='h1'
}
test()
console.log(massage)
结果是h1,因为massage是全局变量,当调用test函数的时候就定义了这个变量,并且可以在函数外访问。
如果test函数内这样生命 var massage =’h1’,则massage是包含它的函数的局部变量,当test函数执行完后,massage变量将被销毁,因此这种情况在打印就出错了
注意:虽然可以通过省略var定义全局变量,但是不推荐这么做,在局部作用域定义的全局变量很难维护,也会造成困惑,这样不能一下子断定省略var是不是有意而为之,在严格模式下,如果想这样给未声明的变量赋值,会导致抛出ReferenceError。
let和var哪个是函数作用域?哪个是块级作用域?
let是块级作用域,var是函数作用域
知识:let(暂时性死区);var(变量提升)
打印结果
var name ='mark'
console.log(window.name)
let age=18
console.log(window.age)
结果:mark,undefined
var声明的变量会成为window对象的属性,而let不会
打印结果是?原因
for(var i=0;i<5;i++){
setTimeout(()=>console.log(i),0)
}
结果:5 5 5 5 5
var所在的作用域为函数作用域,而for循环每次循环创造的作用域是块级作用域。
在每次循环创建新的块级作用域。但是对于var来言,重复声明等于给原本的变量进行赋值。所以会打印5个5。
settimeout的回调函数会在for循环执行完毕再去执行。i的寻找规则是:上层新作用域找i => 函数内找i
使用const的优势
- const 声明变量时必须同时初始化变量,且不能修改const声明的变量
- const声明的限制只适用于它指向变量的引用,即当const声明一个对象时,那么修改这个对象的属性不违反const的限制
优势:方便代码静态扫描和类型推断,尤其是对于数组,方便ide进行原型链可以用的属性提示。
- 通过 const 和 let 声明提升性能 ES6 增加这两个关键字不仅有助于改善代码风格,而且同样有助于改进垃圾回收的过程。因为 const 和 let 都以块(而非函数)为作用域,所以相比于使用 var,使用这两个新关键字可能会更早地让垃圾回 收程序介入,尽早回收应该回收的内存。在块作用域比函数作用域更早终止的情况下,这就有可能发生。