js引擎运行分为两步,预解析 代码执行

(1)预解析: js引擎会拿js里面所有的var还有 function 提升到当前作用域的最前面
(2)代码执行:按照代码书写的顺序从上往下执行


预解析分为:变量预解析(变量提升)和函数预解析(函数提升)
变量提升就是把所有的变量声明提升到作用域的最前面,不提升赋值操做
函数提升:就是把所有函数提升到作用域的最前面,不调用函数

作用域链:内部函数访问外部函数的变量时,采取的是链式查找的方式来决定取哪个值,一层(大括号)一层往外找

下面有几个小题目,大家先尝试着思考并且得出答案,有疑问的话可以看问题后面注释部分的解析。每次在浏览器控制台测试一个题目时,记得注释其他题目哦,否则会相互影响。

解题思路:先预解析,再根据作用域链查找


1 <script> //问题1 变量预解析(变量提升)第一种情况
console.log(num1);
var num1 = 10;
//结果undefined /* 相当于执行了以下代码
var num1;
console.log(num1);
num1 = 10; */ // 问题2 变量预解析(变量提升)第二种情况
fun1();
var fun1 = function() {
console.log("这里测试变量预解析");
}
/* 相当于执行了以下代码
var fun1;
fun1();
fun1 = function() {
console.log("这里测试变量预解析");
} */ // 问题3
fun2(); function fun2() {
console.log("函数预解析");
} /* 相当于执行了以下代码
function fun2() {
console.log("函数预解析");
}
fun2(); */ // 预解析案例1
var num = 10;
fun3(); function fun3() {
console.log("fun3" + num);
var num = 20;
} /* 相当于执行了以下代码
var num; function fun3() {
var num;
console.log(num); //先变量提升,然后根据作用域链查找
num = 20; }
num = 10;
fun3(); */ // 案例2
var num4 = 10; function fun4() {
console.log("fun4" + num4);
var num4 = 20;
console.log("fun4" + num4);
}
fun4(); /* 相当于执行了以下代码
var num4; function fun4() {
var num4;
console.log(num4);
num4 = 20;
console.log(num4);
}
num4 = 10;
fun4(); */ // 案例3
var a = 18;
fun5(); function fun5() {
var b = 9;
console.log(a);
console.log(b);
var a = '123';
} /* 相当于执行了以下代码
var a;
function fun5() {
var b;
var a;
b = 9;
console.log(a);
console.log(b);
a = '123';
}
a = 18;
fun5(); */ // 案例4
fun6();
console.log("fun6 " + p);
console.log("fun6 " + n);
console.log("fun6 " + m); function fun6() {
var a = b = c = 9;
console.log("fun6 " + m);
console.log("fun6 " + n);
console.log("fun6 " + p);
} /*
相当于执行了以下代码 function fun6() {
// 注: var m = n = p = 9; 相当于 var m = 9; n = 9; p = 9; 所以n p 直接赋值,是全局变量 // 而 var m = 9, n = 9, p = 9; 相当于 var m = 9; var n = 9; var p = 9;
var m;
m = 9;
n = 9;
p = 9; console.log(m);
console.log(n);
console.log(p);
}
fun6();
console.log(p);
console.log(n);
console.log(m); */
</script>

js作用域链和预编译的更多相关文章

  1. JS高级---作用域,作用域链和预解析

    作用域,作用域链和预解析     变量---->局部变量和全局变量, 作用域: 就是变量的使用范围   局部作用域和全局作用域 js中没有块级作用域---一对括号中定义的变量,这个变量可以在大括 ...

  2. js作用域链

    js作用域链 <script> var up = 555; function display(){ var innerVar = 2; function inner(){ var inne ...

  3. Rails : css或js文件无法成功预编译或调用jquery类插件时预编译问题

    调用bootstrap css框架时,将bootstrap文件夹放入 vendor/assets/下 bootstrap文件结构如下:    [shenma@localhost demo]$ ls v ...

  4. Js作用域链及变量作用域

    要理解变量的作用域范围就得先理解作用域链 用var关键字声明一个变量时,就是为该变量所在的对象添加了一个属性. 作用域链:由于js的变量都是对象的属性,而该对象可能又是其它对象的属性,而所有的对象都是 ...

  5. js构建工具和预编译

    Gulp应该和Grunt比较,他们的区别我就不说了,说说用处吧.Gulp / Grunt 是一种工具,能够优化前端工作流程.比如自动刷新页面.combo.压缩css.js.编译less等等.简单来说, ...

  6. [js]作用域链查找规则获取值和设置值

    作用域链查找规则获取值和设置值 <script> /** 1.作用域链查找规则 私有作用域出现的一个变量不是私有的,则往上一级作用域查找,上级作用域没有则继续向上级查找,一直找到windo ...

  7. js 作用域链&内存回收&变量&闭包

    闭包主要涉及到js的几个其他的特性:作用域链,垃圾(内存)回收机制,函数嵌套,等等 一.作用域链:函数在定义的时候创建的,用于寻找使用到的变量的值的一个索引,而他内部的规则是,把函数自身的本地变量放在 ...

  8. 【动画演示】:JS 作用域链不在话下

    作者:Lydia Hallie译者:前端小智来源:dev 点赞再看,养成习惯 本文 GitHub https://github.com/qq44924588... 上已经收录,更多往期高赞文章的分类, ...

  9. JS运行三部曲(预编译)

    JS运行的三个步骤: 语法分析 预编译 解释执行 语法分析:通俗来说就是通篇检查你的代码有没有语法错误,有语法错误的话,程序是不会执行的 解释执行:也就是程序读一句执行一句 最重点的也就是预编译了,那 ...

随机推荐

  1. 小代学Spring Boot之集成MyBatis

    想要获取更多文章可以访问我的博客 - 代码无止境. 上一篇小代同学在Spring Boot项目中配置了数据源,但是通常来讲我们访问数据库都会通过一个ORM框架,很少会直接使用JDBC来执行数据库操作的 ...

  2. sql server 2008 NULL值

    SQL支持用NULL符号来表示缺少的值,它使用的是三值谓词逻辑,计算结果可是以TURE.FALSE或UNKNOWN. SQL中不同语言元素处理NULL和UNKNOWN的方式也有所不同,如果逻辑表达式只 ...

  3. iPhone调试移动端webview

    一.模拟器调试 1.启动Xcode 2.选择菜单Xcode - Open Developer Tool - Simulator 3.启动Simulator后,选择Simulator菜单Hardware ...

  4. 利用openpyxl模块处理excel表格

    一.选取表格中的内容创建图表 1.openpyxl支持利用工作表中单元格的数据,创建条形图.折线图.散点图等.步骤如下: 1).从一个矩形区域选择的单元格,创建一个Reference对象. 2).通过 ...

  5. 实验吧--web--你真的会php吗

    ---恢复内容开始--- 实验吧的一道题php审计题.拉下来写一写. http://ctf5.shiyanbar.com/web/PHP/index.php 打开之后说have fun 那就抓包来看看 ...

  6. linux初学者-系统启动故障篇

    linux初学者-系统启动故障篇 在系统的操作中,有时会不小心误删或者操作失误使得系统启动不起来,下文将列举几种常见的系统启动失败的情况及解决的办法. 1.删除或者覆盖mbr的446个字节 mbr的4 ...

  7. linux初学者-数据库管理MariaDB篇

    linux初学者-数据库管理MariaDB篇 MariaDB是一种数据库管理系统,是MySQL的一个分支,但是比MySQL更加优秀,可以说是MySQL的替代品.MariaDB使用的是SQL语句.下文将 ...

  8. spring+mybatis最简多数据源配置

    作者:纯洁的微笑出处:http://www.ityouknow.com/ 版权所有,欢迎保留原文链接进行转载:) 说起多数据源,一般都来解决那些问题呢,主从模式或者业务比较复杂需要连接不同的分库来支持 ...

  9. 【Intellij】导出 jar 包

    需要在 Intellij 导出 jar 包,一时不知道该怎么做,后来总算找到了方法,步骤如下: 1. File → Project Structure... → Artifacts → + → jar ...

  10. powershell小脚本--批量添加用户属性----导出登录时间

    需求1:某公司所有员工少了MAIL属性,需要批量添加.例如,用户chenyy  添加邮件属性chenyy@xxxx.com 先导出(只导出名字)备用: Get-ADUser -Filter * -Pr ...