前言

题目有点大,其实也就是手痒。。。跟大家来扯一下javascript编译过程。

那么到底什么是“编译”呢

这个。。。本人文笔太差,我还是直接举例子吧。

相信玩过js童鞋应该都看过下面这样一个面试题:

       var a=3;
      
function fn(){
alert(a);
function a(){
a=5;
}
         a();
         alert(a); 
       } 
       fn();
       alert(a); 
 

请问上面的题目执行结果如何呢?

各位童鞋答对了没。没答对?。。。没关系。别急。下面进一段js科普:

各位童鞋都听过js是一门解释型语言。什么不知道“解释型语言”是啥。。。

“解释型语言”,通俗点说就是指从上往读一行执行一行。什么还是不知道。。。出门左拐 百度百科。

不错,js确实是一门解释型语言。但是,他是“有编译的”解释执行。

什么叫“有编译”,其实就是在执行前是先对整个程序进行整理(其他语言则是通过编译将源代码整理出目标程序)。

下面我们来看一下js的编译过程到底是怎么样的呢;

就拿上面这个例子来说吧:

首先他声明了一个激活对象,用来存储window内变量

active={a:"",fn:""}

然后对函数变量进行赋值

active.fn=function(){  
              alert(a);
              function a(){
              a=5; }

             a();
             alert(a); 
           } 

然后就开始执行js脚本程序

active.a=a=3;//赋值

active.fn();//执行函数】

执行到这里又发现一个函数,所以又在他的外层建立了一个“激活对象”。用来保存 fn 函数的变量

fnActive={a:3}//已存在变量直接引用了外层的active;

然后对函数变量进行赋值

fnActive.a=function{

    a=5;

  }

然后又开始执行js脚本程序

alert(a);//这时候a是啥啊。。。大家应该知道吧。相当于  alert(fnActive.a);

就这样一层一层进行挖掘。。。

 
a();运行到这一步以后fnActive.a=5了

后面 运行 alert(a); 这里相当于 alert(fnActive.a=5);相信答案已经很明确了
 
最后是。最外层那个 alert(a);了 那么值到底是哪一个呢 由于 fn()这个方法里面操作的其实不是active.a这个值 所以a的值一直没有改变
这里不明确给出答案。只是希望大家自己去试验

总结

第一次写,,,语言表达有不妥之处希望各位童鞋见谅。。。大家试试(为了防止大家哪来主义,答案就不给出了。 大家进来自己敲着试试):

我也来谈javascript高级编程之:javascript函数编译过程的更多相关文章

  1. linux编程之main()函数启动过程【转】

    转自:http://blog.csdn.net/gary_ygl/article/details/8506007 1 最简单的程序  1)编辑helloworld程序,$vim helloworld. ...

  2. Javascript异步编程之setTimeout与setInterval详解分析(一)

    Javascript异步编程之setTimeout与setInterval 在谈到异步编程时,本人最主要会从以下三个方面来总结异步编程(注意:特别解释:是总结,本人也是菜鸟,所以总结不好的,请各位大牛 ...

  3. 【转】Javascript异步编程之setTimeout与setInterval

    Javascript异步编程之setTimeout与setInterval 转自:http://www.tuicool.com/articles/Ebueua 在谈到异步编程时,本人最主要会从以下三个 ...

  4. Python Flask高级编程之RESTFul API前后端分离精讲 (网盘免费分享)

    Python Flask高级编程之RESTFul API前后端分离精讲 (免费分享)  点击链接或搜索QQ号直接加群获取其它资料: 链接:https://pan.baidu.com/s/12eKrJK ...

  5. JavaScript模块化编程之AMD - requireJS基础使用

    JavaScript模块化编程之AMD requireJS基础使用 标签(空格分隔): JavaScript 参考文章 AMD规范 AMD是"Asynchronous Module Defi ...

  6. Python Flask高级编程之从0到1开发《鱼书》精品项目 ☝☝☝

    Python Flask高级编程之从0到1开发<鱼书>精品项目 ☝☝☝ 一 .安装环境我们使用 flask web框架,并用 sqlalchemy来做数据库映射,并使用 migrate做数 ...

  7. javascript 元编程之 method_missing

    javascript 元编程之 method_missing 引言 要说元编程 ruby 中技巧太多了,今天来写的这个技术也来自于 ruby 中的灵感. method_missing 这个在 ruby ...

  8. Python Flask高级编程之从0到1开发《鱼书》精品项目 ✍✍✍

    Python Flask高级编程之从0到1开发<鱼书>精品项目  一 .安装环境我们使用 flask web框架,并用 sqlalchemy来做数据库映射,并使用 migrate做数据迁移 ...

  9. Python Flask高级编程之从0到1开发《鱼书》精品项目

    Python Flask高级编程之从0到1开发<鱼书>精品项目     整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感 ...

随机推荐

  1. Android 动画具体解释View动画

    为了让用户更舒适的在某些情况下,利用动画是那么非常有必要的.Android在3.0一旦支持两种动画Tween动漫Frame动画.Tween动画支持简单的平移,缩放,旋转,渐变.Frame动画就像Gif ...

  2. 选择排序java

    先简述选择排序,然后上代码 进行选择排序就是将所有的元素扫描一遍,从中挑选(或者说是选择,这正是这个排序名字的由来)最小的一个元素,将这个最小的元素与最左边的元素交换位置 ,现在最左边的元素就是有序的 ...

  3. REST API 基于ACCESS TOKEN

    REST API 基于ACCESS TOKEN 的权限解决方案   REST 设计原则是statelessness的,而且但客户端是APP时,从APP发起的请求,不是基于bowers,无法带相同的se ...

  4. 同步特定源代码到 omni_rom源代码目录里面

    #!/bin/bash base_path="/Volumes/Android/omnirom_5.0" #此目录是我存放源代码的目录 xiaomi_device="de ...

  5. Java Web整合开发(78) -- Struts 1

    在Struts1.3中已经取消了<data-sources>标签,也就是说只能在1.2版中配置,因为Apache不推荐在 struts-config.xml中配置数据源.所以建议不要在st ...

  6. Zookeeper实践方案:(4)命名服务

    1.基本介绍 命名服务是指通过指定的名字来获取资源或者服务的地址,提供者的信息.利用Zookeeper非常easy创建一个全局的路径,而这个路径就能够作为一个名字.它能够指向集群中的集群.提供的服务的 ...

  7. [Eclipse]代码已被写入关于如何切换到unix在新行

    切换换行符的显示格式, 一般的设置是这种: 可是这样仅仅能对新文件起作用,原来已经写好的还是那熊样.(怎么办呢,得吃懊悔药啊,谁让你開始没准备好呢?!T_T) 以下就是懊悔药: 这样就OK了. 附:有 ...

  8. 【Web探索之旅】第三部分第一课:服务器

    内容简介 1.第三部分第一课:服务器 2.第三部分第二课预告:IP地址和域名 第三部分第一课:服务器 大家好,欢迎来到[Web探索之旅]的第三部分.这一部分有不少原理,还是很重要的. 这一部分我们会着 ...

  9. Android访问设置

    在需求 AndroidManifest.xml 中增加下面代码: (1)假设应用程序须要訪问网络权限 <uses-permission android:name="android.pe ...

  10. 可以部署在广域网执行QQ高仿版 GG2014 (源代码)

      距上次GG V3.7版本号(可在广域网部署执行的QQ高仿版 -- GG叽叽V3.7.优化视频聊天.控制很多其它相关细节)的公布.已经有50天了,这50天对于GG来说.是一个重大的飞跃. 由于这段时 ...