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. JAVA面试题 手写ArrayList的实现,在笔试中过关斩将?

    面试官Q1:可以手写一个ArrayList的简单实现吗? 我们都知道ArrayList是基于数组实现,如果让你实现JDK源码ArrayList中add().remove().get()方法,你知道如何 ...

  2. SSRS报表-级联筛选参数刷新后不能默认全选 -问题解决方案

    好久没有写博客了,最近更新完善修复了SSRS报表的一些问题,和大家分享. 问题描述: 报表中,区域->专区->省份->地级市 此四个筛选参数是联动的,在DataSet中前一父级参数作 ...

  3. Mask-RCNN:教你如何制作自己的数据集进行像素级的目标检测

    概述 Mask-RCNN,是一个处于像素级别的目标检测手段.目标检测的发展主要历程大概是:RCNN,Fast-RCNN,Fster-RCNN,Darknet,YOLO,YOLOv2,YOLO3(参考目 ...

  4. Python学习1——Python中的 split() 函数

    函数:split() Python中有split()和os.path.split()两个函数,此处简单介绍split()函数:split():拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的 ...

  5. 机器学习-FP Tree

    接着是上一篇的apriori算法: FP Tree数据结构 为了减少I/O次数,FP Tree算法引入了一些数据结构来临时存储数据.这个数据结构包括三部分,如下图所示 第一部分是一个项头表.里面记录了 ...

  6. [PTA] 1001. 害死人不偿命的(3n+1)猜想 (Basic)

    import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Sc ...

  7. cesium 学习(四) Hello World

    一.前言 之前的文章都是基础,搭建环境.部署Cesium.学习资料等等.现在简单入手,一个Hello World页面开发. 二.Hello World 感觉Hello World没有什么特别需要讲的, ...

  8. 【MySQL】java.sql.SQLException: Incorrect string value: '\xF0\x9F\x98\xB3' for column

    问题原因: 输入内容包含特殊字符,MySQL 中的列不支持. 解决方法 多数是修改 MySQL 的数据库和表结构,CHARSET 改为 utf8mb4,但本人测试还是不能传入 emoji. 后来在代码 ...

  9. 【MySQL】

    org.springframework.dao.CannotAcquireLockException: PreparedStatementCallback; Lock wait timeout exc ...

  10. codeforces 327 B. Hungry Sequence

    题目链接 题目就是让你输出n个数的序列,要保证该序列是递增的,并且第i个数的前面不能保护它的约数,我直接先对前100000的素数打表,然后输出前n个,so easy. //cf 191 B #incl ...