javascript预解析和作用域
JavaScript解析过程分为两个阶段:
一是:编译阶段.就是JavaScrip预解析阶段,在这个阶段JavaScript解析器将完成把JavaScript脚本代码转换到字节码;
二是:执行阶段.在编译阶段JavaScript解析器借助执行环境把字节码生成机械码,并顺序执行;
预解析:在当前的作用域中,js代码执行之前浏览器会默认把所有带var 和function的进行提前的声明或者定义;
eg:var num=1;
sum();
function sum(){console.log(num)};//1
执行过程:
1.预解析:查找var,找到num变量,按照与解析的规则,变量的预解析是只声明不赋值.
相当于把num变量放在了全局变量仓库里,但是此时的num并没有赋值,值为undefined.
查找function关键字,发现了函数素描,按照与解析的规则,声明并定义,相当于把sum函数放在全局的仓库,并且赋值了.
2.执行:代码从上到下执行,预解析过的直接略过.
*定义函数的方式有函数声明和函数表达式两种,通过对预解析机制的简单了解我们可以知道只有函数声明的方式才可以将函数执行写在函数声明之前,而使用函数表达式定义的函数则不能先调用后声明
handel1(); //1 函数声明的方式,函数整体被预解析
function handel1(){
alert(1);
}
handel2(); //Uncaught TypeError: undefined is not a function 函数表达式仅仅将变量名进行了预解析
var handel2 = function(){
alert(1);
}
*简单了解我们可以知道只有函数声明的方式才可以将函数执行写在函数声明之前,而使用函数表达式定义的函数则不能先调用后声明,
alert(a); //function a(){alert(4)}
var a = 1;
alert(a); //1
function a(){
alert(2);
}
alert(a); //1
var a = 3;
alert(a); //3
function a(){
alert(4);
}
alert(a); //3
*由于JS是自上而下的执行顺序,单个script标签内为一个完整的执行域,所以会逐个script标签进行以上两步操作
* 当JS解析器执行代码到fn()执行的时候重新执行预解析过程,如果在执行函数里面的代码的时候没有在执行环境中找到相应变量则会在其父级作用域中寻找,这种方式叫做作用域链.
eg:var a=1;
function fn(){
alert(a);//1
a=2;
}
alert(a);//1
fn();
alert(a);//2
*除了var和function会被预解析之外,函数的参数也会被执行环境预解析:
var a = 1;
function fn(a){
alert(a); //undefined
a = 2; //这里修改的是函数作用域内的局部变量a
}
fn();
alert(a); //1
作用域:
全局作用域:在代码中任何地方都能访问到的对象,
(1)最外层函数和在最外层函数外面定义的变量拥有全局作用域.
eg:var num=1;
function sum(){console.log(num)};
(2)所有未定义直接复制的变量自动声明为拥有全局作用域,
eg:function sum(){
var num1=10;//局部变量
num2=20;//全局变量
}
(3)所有window对象的属性拥有全局作用域
一般情况下,window对性的内置属性都拥有全局作用域.
局部作用域:一般只在固定的代码片段内可以访问到,最常见的就是函数内部,所以在一些地方也会看到有人把这种作用域称为是函数作用域.
eg:var num=1;//全局作用域
function sum(number){//number是局部变量
var num2=2;//局部变量
console.log(num);//num为全局变量
num=3;//全局变量
}
函数有一个内部属性[[Scope]],该内部属性包含了函数被创建的作用域中对象的集合,这个集合被称为函数的作用域链,他决定了哪些数据能被函数访问.
javascript预解析和作用域的更多相关文章
- Javascript预解析、作用域、作用域链
最近在看js的一些资料,总结一下昨晚看到的js作用域方面的知识,不准确的地方希望留言指正! 先看片段js代码如下: < script type="text/javascript&quo ...
- JavaScript 之有趣的函数(函数声明、调用、预解析、作用域)
前言:“函数是对象,函数名是指针.”,函数名仅仅是指向函数的指针,与其他包含函数指针的变量没有什么区别,话句话说,一个函数可能有多个名字. -1.函数声明,function+函数名称.调用方法:函数名 ...
- JavaScript预解析
定义:JavaScript"预解析",可以理解为把变量或函数预先解析到它们被使用的环境中. 通俗点讲,即认为浏览器在正式运行JavaScript代码前, 第一步,会预先根据关键字v ...
- JavaScript 预解析机制
首先我们来看一段代码: <script> console.log(a); var a = 10; </script> 此时运行结果为 为什么会显示undefined呢?这就 ...
- JavaScript 预编译与作用域
JavaScript 预编译与作用域 JavaScript 预编译的过程和作用域的分析步骤是 JS 学习中重要的一环,能够帮助我们知道代码的执行顺序,更好理解闭包的概念 预编译 JavaScript ...
- javascript 预解析
内容来源:http://www.cnblogs.com/TomXu/archive/2011/12/28/2286877.html JavaScript中,你可以在函数的任何位置声明多个var语句,并 ...
- 轻松搞定javascript预解析机制(搞定后,一切有关变态面试题都是浮云~~)
hey,guys!我们一起总结一下JS预解析吧! 首先,我们得搞清楚JS预解析和JS逐行执行的关系.其实它们两并不冲突,一个例子轻松理解它们的关系: 你去酒店吃饭,吃饭前你得看下菜谱,点下菜(JS预解 ...
- js---07 js预解析,作用域---闭包
js解析器首先不会逐行读代码,这是第二部了. 首先 根据var找到变量,根据function找函数,找到变量var a = 1,js解析器只会读取等号前面的var a,并把a设置值未定义,并不会读取等 ...
- js的预解析和作用域
预解析指的就是,在js文件或者script里面的代码在正式开始执行之前,进行的一些解析工作.这个工作很简单,就是在全局中寻找var关键字声明的变量和通过function关键字声明的函数. 1.寻找 v ...
随机推荐
- eclipse设置字体、背景(豆绿)色、自动提示
背景色:(护眼豆绿色) window-->preferences-->General-->Editors-->Text Editors-->(最下遍一栏中的)Backgr ...
- noip赛前小结1
正是noip前夕,我的心却颇不宁静. 最近的内部测试,我的成绩非常不稳定,一会儿可以考个第一,一会儿也可以掉得很低. 总之感觉非常的焦虑. 何以解忧?唯有作文. 要有良好的生活作息. 最近考试不稳定的 ...
- 如何使用JavaScript和正则表达式进行数据验证
利用客户端JavaScript的优势,JavaScript中的正则表达式可以简化数据验证的工作,下面与大家分享下如何使用JavaScript和正则表达式进行数据验证,感兴趣的朋友可以参考下哈 数据验证 ...
- Js作用域链及变量作用域
要理解变量的作用域范围就得先理解作用域链 用var关键字声明一个变量时,就是为该变量所在的对象添加了一个属性. 作用域链:由于js的变量都是对象的属性,而该对象可能又是其它对象的属性,而所有的对象都是 ...
- robotframework笔记14
创建用户关键字 关键字表是用于创建新的更高层次的关键词 结合现有的关键词. 这些关键字被称为 用户 关键字 区分他们的最低水平 库关键字 实现在测试库. 的语法创建用户 关键词非常接近的语法创建测试用 ...
- WANL标准组织介绍-02
无线电管理委员会 FCC ETSI IEEE Wi-Fi IETF WAPI 国家无线电管理委员会认证 国家无线电管理委员会认证(State Radio Regulatory Commission o ...
- R语言自带数据包
向量 euro #欧元汇率,长度为11,每个元素都有命名 landmasses #48个陆地的面积,每个都有命名 precip #长度为70的命名向量 rivers #北美14 ...
- Spring配置文件解析--依赖注入
1.构造器注入基于构造器的DI通过调用带参数的构造器来实现,每个参数代表着一个依赖.此外,还可通过给stattic工厂方法传参数来构造bean.构造器参数解析根据参数类型进行匹配,如果bean的构造器 ...
- centos彻底删除文件夹、文件命令
[1]新建文件夹 格式:mkdir 文件名 view source1 mkdir /home/test 新建一个名为test的文件夹在home下 [2]新建文本 vi /home/test.s ...
- centOS wget的安装和使用
CentOS wget是一个从网络上自动下载文件的自由工具.它支持HTTP,HTTPS和FTP协议,可以使用HTTP代理. 所谓的自动下载是指,CentOS wget可以在用户退出系统的之后在后台执行 ...