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运行的三个步骤: 语法分析 预编译 解释执行 语法分析:通俗来说就是通篇检查你的代码有没有语法错误,有语法错误的话,程序是不会执行的 解释执行:也就是程序读一句执行一句 最重点的也就是预编译了,那 ...
随机推荐
- NET Core CSharp初级篇 1-3面向对象
.NET Core CSharp初级篇 1-3 本节内容为面向对象初级教程 类 简介 面向对象是整个C#中最核心最有特色的一个模块了,它很好的诠释了程序与现实世界的联系. 面向对象的三大特征:继承.多 ...
- 码云及Git的使用
什么是码云 码云就是相当一个远程仓库,在以后的工作中,你和同事负责工作的不同部分,齐头并进,最后上传到码云,类似于一个汇总的作用. 同一个绳上的不同分支 码云网址链接:https://gitee.co ...
- 多个module实体类集合打一个jar包并上传至远程库
本章内容主要分享多个module中的实体类集合生成到一个jar包中,并且发布到远程库:这里采用maven-assembly-plugin插件的功能来操作打包,内容不长却贴近实战切值得拥有,主要节点内容 ...
- kubernetes的volume的权限设置(属主和属组)
apiVersion: v1kind: Podmetadata: name: hello-worldspec: containers: # specification of the pod's c ...
- C# ORM简单原理
对象/关系数据库映射(object/relational mapping,ORM)这个术语表示一种技术,用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去. 在今日的企业环境中,把面向对象 ...
- python元类深入理解
1.python 中的类 在python中,类也是一个对象,只不过这个对象拥有生成实例的能力,我们一般使用class XXX来定义一个类,在python解释器执行到这个地方的时候会自动创建出这个对象, ...
- [机器学习] SVM——Hinge与Kernel
Support Vector Machine [学习.内化]--讲出来才是真的听懂了,分享在这里也给后面的小伙伴点帮助. learn from: https://www.youtube.com/wat ...
- JDK容器类Map源码解读
java.util.Map接口是JDK1.2开始提供的一个基于键值对的散列表接口,其设计的初衷是为了替换JDK1.0中的java.util.Dictionary抽象类.Dictionary是JDK最初 ...
- 0 MapReduce实现Reduce Side Join操作
一.准备两张表以及对应的数据 (1)m_ys_lab_jointest_a(以下简称表A) 建表语句: create table if not exists m_ys_lab_jointest_a ( ...
- idea中写servlet时报错--关于405错误
将super方法注释掉 原因:super是调用了此类继承父类doget和dopost方法的, 如果此类中没有这个方法,就会报错The specified HTTP method is not allo ...