我也来谈javascript高级编程之:javascript函数编译过程
前言
题目有点大,其实也就是手痒。。。跟大家来扯一下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函数编译过程的更多相关文章
- linux编程之main()函数启动过程【转】
转自:http://blog.csdn.net/gary_ygl/article/details/8506007 1 最简单的程序 1)编辑helloworld程序,$vim helloworld. ...
- Javascript异步编程之setTimeout与setInterval详解分析(一)
Javascript异步编程之setTimeout与setInterval 在谈到异步编程时,本人最主要会从以下三个方面来总结异步编程(注意:特别解释:是总结,本人也是菜鸟,所以总结不好的,请各位大牛 ...
- 【转】Javascript异步编程之setTimeout与setInterval
Javascript异步编程之setTimeout与setInterval 转自:http://www.tuicool.com/articles/Ebueua 在谈到异步编程时,本人最主要会从以下三个 ...
- Python Flask高级编程之RESTFul API前后端分离精讲 (网盘免费分享)
Python Flask高级编程之RESTFul API前后端分离精讲 (免费分享) 点击链接或搜索QQ号直接加群获取其它资料: 链接:https://pan.baidu.com/s/12eKrJK ...
- JavaScript模块化编程之AMD - requireJS基础使用
JavaScript模块化编程之AMD requireJS基础使用 标签(空格分隔): JavaScript 参考文章 AMD规范 AMD是"Asynchronous Module Defi ...
- Python Flask高级编程之从0到1开发《鱼书》精品项目 ☝☝☝
Python Flask高级编程之从0到1开发<鱼书>精品项目 ☝☝☝ 一 .安装环境我们使用 flask web框架,并用 sqlalchemy来做数据库映射,并使用 migrate做数 ...
- javascript 元编程之 method_missing
javascript 元编程之 method_missing 引言 要说元编程 ruby 中技巧太多了,今天来写的这个技术也来自于 ruby 中的灵感. method_missing 这个在 ruby ...
- Python Flask高级编程之从0到1开发《鱼书》精品项目 ✍✍✍
Python Flask高级编程之从0到1开发<鱼书>精品项目 一 .安装环境我们使用 flask web框架,并用 sqlalchemy来做数据库映射,并使用 migrate做数据迁移 ...
- Python Flask高级编程之从0到1开发《鱼书》精品项目
Python Flask高级编程之从0到1开发<鱼书>精品项目 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感 ...
随机推荐
- 【读书札记】建立第一个Web项目
安装配置好jdk.tomcat,我用的版本号是7.0.54,我放在C:\server\apache-tomcat-7.0.54下, CATALINA_BASE:C:\server\apache-tom ...
- 【 D3.js 入门系列 --- 4 】 怎样使用scale(比例)
本人的个人博客为: www.ourd3js.com csdn博客为: blog.csdn.net/lzhlzz 转载请注明出处,谢谢. 在上一节中使用了一个非常重要的概念 - scale (这个不知道 ...
- xp硬盘安装Fedora14 过程记录及心得体会(fedora14 live版本680M 和fedora14 DVD版本3.2G的选择)
这次电脑奔溃了,奇怪的是直接ghost覆盖c盘竟然不中.之前电脑上硬盘安装的fedora14操作系统,也是双系统.不知道是不是这个问题,记得同学说过,在硬盘装fedora之后,要手动修改c盘隐藏的那个 ...
- (转)FFMPEG解码流程
http://www.douban.com/note/228831821/ FFMPEG解码流程: 1. 注册所有容器格式和CODEC: av_register_all() 2. 打开 ...
- 修改easyui datebox默认日期格式
问题描述: 根据jquery easyui datebox demo中给的示例,导入和使用datebox, 发现日期格式为: 6/22/2011, 其他的今天和关闭也是 Today, Close, 对 ...
- Android.mk参数解释
-------------------- 下面对Android.mk 中经常出现的变量进行讲解 -------------------- 这些变量,你会经常在Android.mk文件中见到,下面以字表 ...
- LoaderManager使用具体解释(二)---了解LoaderManager
了解LoaderManager 这篇文章将介绍LoaderManager类,这是该系列的第二篇文章. 一:Loaders之前世界 二:了解LoaderManager 三:实现Loaders 四:实例: ...
- Light OJ Dynamic Programming
免费做一样新 1004 - Monkey Banana Problem 号码塔 1005 - Rooks 排列 1013 - Love Calculator LCS变形 dp[i][j][k]对于第一 ...
- CentOS 5 安装Oracle10g
原创作品.离 "深蓝的blog" 博客.欢迎转载.转载时请务必注明下面出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlon ...
- MySQLHA系列MHA(一)
MHA,这是Master High Availability Manager and Tools for MySQL,一个日本MySQL专家们使用Perl语言编写的一个脚本管理工具.该工具仅适用于My ...