js作用域链和预编译
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作用域链和预编译的更多相关文章
- JS高级---作用域,作用域链和预解析
作用域,作用域链和预解析 变量---->局部变量和全局变量, 作用域: 就是变量的使用范围 局部作用域和全局作用域 js中没有块级作用域---一对括号中定义的变量,这个变量可以在大括 ...
- js作用域链
js作用域链 <script> var up = 555; function display(){ var innerVar = 2; function inner(){ var inne ...
- Rails : css或js文件无法成功预编译或调用jquery类插件时预编译问题
调用bootstrap css框架时,将bootstrap文件夹放入 vendor/assets/下 bootstrap文件结构如下: [shenma@localhost demo]$ ls v ...
- Js作用域链及变量作用域
要理解变量的作用域范围就得先理解作用域链 用var关键字声明一个变量时,就是为该变量所在的对象添加了一个属性. 作用域链:由于js的变量都是对象的属性,而该对象可能又是其它对象的属性,而所有的对象都是 ...
- js构建工具和预编译
Gulp应该和Grunt比较,他们的区别我就不说了,说说用处吧.Gulp / Grunt 是一种工具,能够优化前端工作流程.比如自动刷新页面.combo.压缩css.js.编译less等等.简单来说, ...
- [js]作用域链查找规则获取值和设置值
作用域链查找规则获取值和设置值 <script> /** 1.作用域链查找规则 私有作用域出现的一个变量不是私有的,则往上一级作用域查找,上级作用域没有则继续向上级查找,一直找到windo ...
- js 作用域链&内存回收&变量&闭包
闭包主要涉及到js的几个其他的特性:作用域链,垃圾(内存)回收机制,函数嵌套,等等 一.作用域链:函数在定义的时候创建的,用于寻找使用到的变量的值的一个索引,而他内部的规则是,把函数自身的本地变量放在 ...
- 【动画演示】:JS 作用域链不在话下
作者:Lydia Hallie译者:前端小智来源:dev 点赞再看,养成习惯 本文 GitHub https://github.com/qq44924588... 上已经收录,更多往期高赞文章的分类, ...
- JS运行三部曲(预编译)
JS运行的三个步骤: 语法分析 预编译 解释执行 语法分析:通俗来说就是通篇检查你的代码有没有语法错误,有语法错误的话,程序是不会执行的 解释执行:也就是程序读一句执行一句 最重点的也就是预编译了,那 ...
随机推荐
- Spring+MyBatis时Access denied for user '高欢欢'@'localhost' (using password: YES)的异常解决方案
今天在做spring+mybatis整合的时候系统只要一运行就会报下面的错误,搞了几个小时硬是没有找的原因 警告: com.mchange.v2.resourcepool.BasicResourceP ...
- ZIP:ZipFile
ZipFile: /* 此类用于从 ZIP 文件读取条目 */ ZipFile(File file) :打开供阅读的 ZIP 文件,由指定的 File 对象给出. ZipFile(File file, ...
- 【题解】埃及分数-C++
Description 在古埃及,人们使用单位分数的和(形如1/a的, a是自然数)表示一切有理数. 如:2/3=1/2+1/6,但不允许2/3=1/3+1/3,因为加数中有相同的. 对于一个分数a/ ...
- 多个数据库 migration
More than one DbContext was found. Specify which one to use. Use the '-Context' parameter for PowerS ...
- 网页学习:day1
初始准备: Write some function Write a titie Write a article Write some button Button function写法: functio ...
- xss magic_quotes_gpc
---恢复内容开始--- magic_quotes_gpc函数,在php5.4以上移除了, 但是很奇怪的是 我的5.6版本这边 是可以找到这个选项的. 在php.ini文件里面,默认关闭,如果将此 ...
- string的赋值
string的赋值 string s1="123456"; 一: 只能在刚开始定义的时候用: (1) 从后往前赋值 string s2(s1,3); ...
- 【原创】用事实说话,Firefox 的性能是 Chrome 的 2 倍,Edge 的 4 倍,IE11 的 6 倍!
前言 每个浏览器新版本发布,都号称性能有显著提升,并且市面有各种测试工具,测试结果也是大相径庭,比如下面这篇文章: https://www.oschina.net/news/97924/browser ...
- CF175C Geometry Horse(贪心)
CF175C 贪心,注意有不少细节,很容易死循环TLE 贪心是显而易见的,每次枚举价值最小的物品,进行销毁操作 朴素的枚举每一件物品复杂度为\(O(\sum k_i)\),明显超时 我们注意到朴素的+ ...
- hive show databases 添加条件
show databases like 'test012301' ; 通配符: show databases like 'a*';