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){
}else{
}
</script>
以上代码再次验证了预编译,并且说明预编译与条件无关。先弹出nn的函数定义,再弹出undefined。上面这一句其实在不同浏览器下,效果是不一样的。
在火狐下面 会报错 nn未定义 不排除高版本的修正过来,在chrome 和 ie下确实是先弹出nn的函数定义再弹出undefined。
<script>
</script>
执行结果是"function"和"variable"。
JS解析器先预定义了 addB 变量为 undefined, 但是 addB 函数覆盖了此变量,因此一开始执行结果是 function,然后 addB 被赋值为 "variable",因此最后执行结果是 "variable",上面的代码即使变为
<script>
</script>
结果也一样,这说明JS解析器先预声明变量,再预定义函数 。
小结一下:JS 在执行前会进行类似"预编译"的操作,而且先预定义变量再预定义函数。
- js的预编译(很神奇的东西)
- 神奇的东西
- 神奇的东西
- js的预编译理解
- js 当中的预编译
- 爱情是个很神奇的东西
- 发现一个神奇的东西
- 老生长谈的JS预编译
- 神奇的JS代码
- 发现ffmpeg真是个神奇的东西
- 回调函数,一个神奇的东西
- js的一下东西
- 神奇的JS“魔法代码”
- 一个神奇的JS网站
- 一段神奇的js代码
- 预编译,编译,汇编,链接,这些困扰我很久的东西今天是个了结了
- js(四)---预编译
- 构建基于 NodeJS 的 LESS.js 预编译 CSS 服务
- c++成员函数的重载、覆盖(override)与隐藏
- CODEVS 1474 十进制转m进制
- Oracle SQL 分析函数
- Eclipse新建Maven web项目
- Socket的阻塞/非阻塞
- js的预编译(很神奇的东西)
- 背包问题
- Android Bitmap详细介绍
- 红黑二叉树
- C语言及程序设计初步例程-39 求素数算法
- Trigger
- CentOS 安装easy_install、pip的方法
- Rescue
- [CentOS] [Errno 256] No more mirrors to try