以下执行的结果是什么?为什么

  1. function test(){
  2. massage='h1'
  3. }
  4. test()
  5. console.log(massage)

结果是h1,因为massage是全局变量,当调用test函数的时候就定义了这个变量,并且可以在函数外访问。
如果test函数内这样生命 var massage =’h1’,则massage是包含它的函数的局部变量,当test函数执行完后,massage变量将被销毁,因此这种情况在打印就出错了

注意:虽然可以通过省略var定义全局变量,但是不推荐这么做,在局部作用域定义的全局变量很难维护,也会造成困惑,这样不能一下子断定省略var是不是有意而为之,在严格模式下,如果想这样给未声明的变量赋值,会导致抛出ReferenceError。

let和var哪个是函数作用域?哪个是块级作用域?

let是块级作用域,var是函数作用域
知识:let(暂时性死区);var(变量提升)

打印结果

  1. var name ='mark'
  2. console.log(window.name)
  3. let age=18
  4. console.log(window.age)

结果:mark,undefined
var声明的变量会成为window对象的属性,而let不会

打印结果是?原因

  1. for(var i=0;i<5;i++){
  2. setTimeout(()=>console.log(i),0)
  3. }

结果:5 5 5 5 5
var所在的作用域为函数作用域,而for循环每次循环创造的作用域是块级作用域。
在每次循环创建新的块级作用域。但是对于var来言,重复声明等于给原本的变量进行赋值。所以会打印5个5。

settimeout的回调函数会在for循环执行完毕再去执行。i的寻找规则是:上层新作用域找i => 函数内找i

使用const的优势

  • const 声明变量时必须同时初始化变量,且不能修改const声明的变量
  • const声明的限制只适用于它指向变量的引用,即当const声明一个对象时,那么修改这个对象的属性不违反const的限制

优势:方便代码静态扫描和类型推断,尤其是对于数组,方便ide进行原型链可以用的属性提示。

  1. 通过 const 和 let 声明提升性能 ES6 增加这两个关键字不仅有助于改善代码风格,而且同样有助于改进垃圾回收的过程。因为 const 和 let 都以块(而非函数)为作用域,所以相比于使用 var,使用这两个新关键字可能会更早地让垃圾回 收程序介入,尽早回收应该回收的内存。在块作用域比函数作用域更早终止的情况下,这就有可能发生。

拓展阅读

https://mp.weixin.qq.com/s/0CI53KqjzkEfPp7FvC-GcQ