JS 代码片段 / 预编译/预解析 /执行上下文/ECG/EC/ECS/GO/VO/AO
代码段概念
- 一个 script 就是一个代码段
- 在一个页面中可以有多个代码段
- 每一个代码段, 彼此独立的, 如果上面的代码段报错了, 不会影响下一个代码段
- referenceError 引用错误
- 下面代码段中定义的数据, 在下面的代码段中可以使用
预编译 / 预解析
- 预解析期间做了什么
- 声明提升 ,var 定义的变量 提升的仅仅是声明, 没有赋值, 强行调用, 返回 undefined;function 声明的函数整体要提升, 提升到代码段的最前面,** 函数是一等公民 **, 同名函数名和变量, 优先同名函数
- 如果是函数内部的局部变量, 就提升到函数内部的最前面
- var 定义的变量仅仅是提升, 函数提升不仅是声明, 还有赋值
- 函数表达式 本质是一个变量
fun();// 这里会报错, 函数表达式提升 只声明没赋值, 这里 fun 的值是 undefined
var fun = function(){console.log('fun...')}
- 函数也会提升, 如果提升变量名和函数名一样, 只会存在一个名字, 所以函数提升后 同名变量的值就会变成函数
console.log(v);
var v = 123;
function v(){}
console.log(v); // 输出
// function v(){}
// 123
- 函数内部没有定义的的变量, 是全局变量
function fn(){a = 100 //a 在函数内部没有定义 就是全局变量}
fn()console.log(a) //110
数据存储
1. 栈 - 基本数据类型
1.
2. 堆 - 引用数据类型
1. GO 全局对象
2. VO 变量对象 用来存放当前执行上下文中创建的数据
JS 变量都存储在内存中,而内存给变量开辟了两块存储空间,分别为栈(stack)空间和堆(heap)空间;
栈空间:存放 JS 基本数据类型,通过按值访问,可以直接操作保存在变量中的实际值;
堆空间:存放 JS 引用数据类型,通过对象的引用访问,不可以直接访问堆内存空间中的位置和操作堆内存空间。只能操作对象在栈内存中的引用地
址。
ECG 执行上下文
1. 全局代码执行时就会产生全局的执行上下文, execution context globle
2. 每当调用函数就产生一个局部的执行上下文 EC
3. 执行上下文产生时, 都需要放到一个栈中, 这个就是执行上下文栈 execution context stack
4. 函数调用完毕, 函数的 EC 就要出栈, 当 ECG 执行完毕时, ECG 也要出栈
5. 出入栈 遵循 先进后出 也就是 ECG 先进 最后出来
6. 代码的数据都是在上下文 EC 中去找
堆
1. js 在代码执行时, 会在堆中创建一个全局对象,Globle Object GO
2. 在浏览器中 这个 GO 就是 window
3. GO 是一个 window , window 是一个全局对象, 对象是属性的无序集合
4. 声明的全局变量 和 在全局代码中写的函数都挂载在 GO 上


JS 代码片段 / 预编译/预解析 /执行上下文/ECG/EC/ECS/GO/VO/AO的更多相关文章
- 127个常用的JS代码片段,每段代码花30秒就能看懂(上)
127个常用的JS代码片段,每段代码花30秒就能看懂(上) JavaScript 是目前最流行的编程语言之一,正如大多数人所说:“如果你想学一门编程语言,请学JavaScript.” FreeCode ...
- 常用JS代码片段
1.隐藏部分数字,如手机号码,身份证号码 1 2 3 function (str,start,length,mask_char){ return str.replace(str.substr(star ...
- 【学习笔记】深入理解js原型和闭包(11)——执行上下文栈
继续上文的内容. 执行全局代码时,会产生一个执行上下文环境,每次调用函数都又会产生执行上下文环境.当函数调用完成时,这个上下文环境以及其中的数据都会被消除,再重新回到全局上下文环境.处于活动状态的执行 ...
- js预编译和函数执行
javascript 执行过程 1.语法检测(有没有基本的语法错误,例如中文,关键字错误...)2.词法分析(预编译) (1)创建全局GO(global object)对象 (2)对var声明的变量进 ...
- 还原真实,javascript之预编译 / 预解析
今天在群里吹水时,有群友提出一个问题.我一看很简单,就立马给出了答案:因为存在变量提升,所以输出undefined.本以为无人反驳,可确招来口诛笔伐.作为写实派的我,一贯以来坚持真实是我的使命,岂能容 ...
- PreparedStatement预编译的sql执行对象
一.预编译,防sql注入 其中,设置参数值占位符索引从1开始:在由sql 连接对象创建 sql执行对象时候传入参数sql语句,在执行对象在执行方法时候就不用再传入sql语句: 数据库索引一般是从1开始 ...
- 常用的js代码片段
1.单选框/手风琴 <script> $(document).ready(function(){ $("dd").on("click",functi ...
- Atom编辑器折腾记_(15)JS代码片段补全(插件:javascript-snippets)
题外话 这款插件就比較重量级了-.用熟悉了写原生JS的效率要提升非常多--并且,不仅支持JS还包括了nodejs snippet javascript-snippets 插件作者: zenorocha ...
- 解决js代码中加入alert()就成功执行,不加就不对的问题!
问题: jquery中的$(document).ready(function(){})中调用两个方法(1)利用ajax请求去后台查图书类别的方法(2)当页面上利用图书类别去查询图书返回页面,让图书类别 ...
- 汇总前端最最常用的JS代码片段
html5选择器 //参数均接收一个合法的css选择器 element = document.querySelector('.foo,.bar');//返回带有foo或者bar样式类的首个元素 ele ...
随机推荐
- ES6的新特性有哪些
1.let.const 2.模板字符串 3.箭头函数 4.解构赋值 5.promise 6.数组的新方法 7.对象的新方法 8.class类 9.新增Set.Map两种数据结构 10.proxy
- NETAPP 设备 C模式开关机顺序
设备正常开关机顺序开机顺序: 1.开启所有磁盘柜的电源,大概20秒后再开启存储控制器: 2.开启接有FAS2750存储的以太网交换机或者光纤交换机: 3.开启有挂载FAS2750存储空间的服务器或者磁 ...
- 2.11-12 滴水new-delete-vector(动态数组编写)
去长沙玩了几天,没学 1.new 与 delete 通过调用分析了解到new在堆区开辟数据 delete就是释放数据 案例 #include<stdio.h> #include <m ...
- Cesium模型贴地问题(八)
2023-01-12 1.sampleTerrainMostDetailed 根据提供的terrainPrivider和点的弧度坐标计算出当前点的高度信息. var p = new Cesium.Ca ...
- JZOJ 5460. 士兵训练
题目 \(1\le n,q \le 2\cdot {10}^5,0\le b_i,l_i \le {10}^9,b_i \ge 1,1 \le S_i \le n\) \(Solution\) 这题很 ...
- JZOJ 3527.迷宫花坛(garden)
题面 思路 考场想到 \(tarjan\) 缩点 然而忘了缩点怎么打 于是甩了个暴力 改题时学了个圆方树 发现挺好用 于是······注意重边 \(Code\) #include<cstdio& ...
- JZOJ 1121. Fix
解析 考场时想多了,其实根本不用分阶段 一维状压 \(DP\) 就行了 可我没想清楚,加了个第几次去稳固一个点的阶段 然后时间就炸了!!! \(Code\) #include<cstdio> ...
- C#本地时间转Unix时间
获取Unix时间最高效的方法 /// <summary> /// 扩展方法, 本地时间转Unix时间; (如 本地时间 "2020-01-01 20:20:10" 转换 ...
- vulnhub靶场之WORST WESTERN HOTEL: 1
准备: 攻击机:虚拟机kali.本机win10. 靶机:Worst Western Hotel: 1,下载地址:https://download.vulnhub.com/worstwesternhot ...
- adb+monkey常用命令记录升级版
为什么要叫升级版呢,本来打算自己写一下adb常用命令的,但是在网上看到一个比较好的,就没有自己从头开始写,但是该博主写的有点小瑕疵就是缺少日志过滤和关于monkey的命令,笔者就加了关于日志和monk ...