js的预编译(很神奇的东西)

来源:互联网 发布:阿里云 http 转https 编辑:程序博客网 时间:2024/05/16 12:57

昨天在论坛上面看到这么一个帖子《回答得了分数拿去,考js基础》;于是乎看到这样的一道题

<script>var aa="aa";function test(){    alert(aa);    var aa='bb';    alert(aa);}test();</scirpt>

我给出的结果是  aa  bb,觉得在test()执行的时候,应该会顺着作用域链的问题 找到window下的aa,输出 aa,然后执行了 var aa=‘bb’;之后再执行alert(aa);的时候就应该是输出‘bb’了,正常的答案是  undefinded bb;再了解原因的时候,了解到了 是“js预编译”作祟

以下内容来自http://blog.sina.com.cn/s/blog_655388ed01013gec.html

function mm(){ }

这种形式是声明一个函数,跟 var 一个变量的机制一样,脚本在解释执行之前会做预编译处理,而

var mm = function(){ }

这种形式是对一个变量赋值,虽然也做预编译,但仅仅只是给 mm 事先变量分配一个内存空间,而没有做初始化

请测试以下几段代码

代码一:

<script type="text/javascript">

window.alert(mm);

function mm(){

}

</script>

以上代码你会看到能 alert 出来 mm 的内容,但 alert 却是在 function 声明之前的,验证了脚本宿主在执行之前对脚本做了预编译处理

代码二:

<script type="text/javascript">

window.alert(mm);

var mm = 123;

</script>

以上代码你会看到 alert 出一个 undefined 来,说明脚本宿主在执行之前对脚本做了预编译:对 mm 分配内存空间但并不初始化它

代码三:

<script type="text/javascript">

window.alert(nn);

window.alert(aa);

if(true){

         function mm(){ }

         var aa = 1;

}else{

         function nn(){ }

         var aa = 2;

}

</script>

以上代码再次验证了预编译,并且说明预编译与条件无关。先弹出nn的函数定义,再弹出undefined。
上面这一句其实在不同浏览器下,效果是不一样的。
在火狐下面 会报错 nn未定义 不排除高版本的修正过来,在chrome 和 ie下确实是先弹出nn的函数定义再弹出undefined。

<script>
  alert(typeof addB);
  var addB = "variable";
  function addB() {
  alert("function addB");
  }
  alert(addB);
</script>


执行结果是"function"和"variable"。
JS解析器先预定义了 addB 变量为 undefined, 但是 addB 函数覆盖了此变量,因此一开始执行结果是 function,然后 addB 被赋值为 "variable",因此最后执行结果是 "variable",上面的代码即使变为

<script>
  alert(typeof addB);
  function addB() {
  alert("function addB");
  }
  var addB = "variable";
  alert(addB);
</script>


结果也一样,这说明JS解析器先预声明变量,再预定义函数 。
小结一下:JS 在执行前会进行类似"预编译"的操作,而且先预定义变量再预定义函数。
0 0
原创粉丝点击