说一说js中的“没节操”的预解释

js预解释是代码执行之前就干了些事,有两类预解释,带var 和带function,具体看看
  • 带var关键字预解释
    alert(n);//弹出undefined
    var n = 10;
  • 带function关键字预解释
    fn();//弹出hello
    function fn(){
    alert('hello');
    }

它们为什么会这样呢?

  • 原因是javascript中有声明和定义这两个概念,我们通常用var关键来声明变量,用function关键字来定义函数,在预解释时,function关键字声明和定义函数是同时执行的,而var它只能声明变量,并不具备定义的功能。

在看一个无节操的例子:

alert(n);//undefined
fn(); //hello
if(false) {
  var n = 10;
  function fn(){
      alert('hello');
  }
}

第一行代码执行会弹出undefined,第二行代码执行会弹出hello;是因为n和fn在代码执行前被预解释了,即使if条件判断为false,执着的浏览器引擎也会将带var关键字声明的变量n和带function关键定义的fn扫描到。

  • 预解释忽略重新声明,不忽略重新定义
    alert(n);//undefiend
    var n = 10;
    var n = 9;
    var n;
    alert(n);//9

你可能感兴趣的:(说一说js中的“没节操”的预解释)