JS执行过程

1、首先是预解析:预解析过程最重要的是提升,在JavaScript代码在预解析阶段,会对以var声明的变量名,和function开头的语句块,进行提升操作

2、执行操作

全局中解析和执行过程

<script>
console.log(a);//undefined===>window.a
console.log(b);//b is not defined
console.log(fn1);//会打印函数===>window.fn1
console.log(fn2);//undefined===>window.fn2
var a = 1;
b = 2;
function fn1() {
console.log('函数1');
}
var fn2 = function () {
console.log('函数2');
}
</script>
<script>
var a;
console.log(window);
</script>

<script>
var a = 1;
console.log(window);
</script>

上述例子有变量有函数(在全局作用域下):

1、对于有var声明的函数,就等同于window.a,相当于在js第一次扫描代码时候(预解析),给window添加了一个a的属性,但是没有赋值,所以打印结果是undefined

2、对于没有var声明的函数,在js第一次扫描代码时候(预解析)不会给windouw添加任何属性,所有会直接报错

3、对于以function开头的函数,就等同于window.fn1,相当于在js第一次扫描代码时候(预解析),给window添加了一个fn1的属性,而且是直接赋值的(函数的引用),所以打印结果是一个函数

4、对于没有以function开头的函数(也就是函数表达式),其过程相当于var a的过程,在js第一次扫描时(预解析),给window添加了一个fn2的属性,但是没有赋值,所以打印结果是undefined

命名冲突

<script>
console.log(f);//打印函数
var f = 1;
function f(){
console.log('foodoir');
}
</script>
<script>
console.log(f);//打印函数
function f(){
console.log('foodoir');
}
var f = 1;
</script>
<script>
console.log(f);//undefined
var f = 1;
var f = 2;
</script>
<script>
console.log(f);//打印第二个函数
function f(){
console.log('foodoir');
}
function f(){
console.log('hello world');
}
</script>

1、函数与变量命名冲突时,变量会被直接忽略,保留的永远的都是函数

2、函数与函数命名冲突时,最后的函数会替换之前的函数

3、变量与变量命名冲突时,永远都是undefined

 函数中的解析与执行过程

<script>
function f(a, b) {
alert(a);
alert(b); var b = 100; function a() {
}
}
f(1, 2);//依次弹出function a(){}以及2
</script>
<script>
function f(a, b) {
alert(a);
alert(b); var b = 100; function a() {
}
}
f(1);//依次弹出function a(){}以及undefined
</script>

函数中的解析过程与全局类似

1、在第一次扫描js代码时,首先会将a变量提升,但是扫描到最后发现有函数a,这里有命名冲突,那么就会直接将变量忽略

2、b变量没有命名冲突,但是第一次扫描后,b只是提升并没有赋值,所以上面代码段一中,正式执行代码的时候就会弹出2

JS高级——变量提升的更多相关文章

  1. 深入理解js的变量提升和函数提升

    一.变量提升 在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域.变量提升即将变量声明提升到它所在作用域的最开始的部分.上个简历的例子如: ...

  2. js中变量提升(一个是变量,一个是函数表达式都会存在变量提升,函数声明不存在)

    一.变量提升 在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域.变量提升即将变量声明提升到它所在作用域的最开始的部分.上个简历的例子如: ...

  3. 深入理解js的变量提升和函数提升(转)

    一.变量提升 在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域.变量提升即将变量声明提升到它所在作用域的最开始的部分.上个简历的例子如: ...

  4. 关于JS中变量提升的规则和原理的一点理解

        关于变量提升,以前在一些教程和书籍上都听到过,平时开发中也知道有这个规律,但是今天突然在一个公开课中听到时,第一反应时一脸懵逼,然后一百度,瞬间觉得好熟悉啊,差点被这个概念给唬住了,不信我给你 ...

  5. js 1.变量提升 2.条件语句 3.循环语句 4.加号+的使用

    1.变量提升 变量提升是浏览器的一个功能,在运行js 代码执行前,浏览器会给js一个全局作用域叫 window,window 分两个模块,一个叫运营模块,内存模块找到当前作用域下的所有带var和fun ...

  6. 关于JS中变量提升的规则和原理的一点理解(二)

    上篇文章中讲到变量提升和函数提升的先后顺序时蒙了,后来去查了一下资料,特别整理一下. 在<你不知道的JavaScript(上卷)>一书的第40页中写到:函数会首先被提升,然后才是变量. 书 ...

  7. js javascript变量提升

    var:变量提升(无论声明在何处,都会被提至其所在作用域的顶部) let:无变量提升(所在的块内,未到let声明时(即let声明之前),是无法访问该变量的(not defined)),let变量不能重 ...

  8. js中变量提升和函数提升

    变量提升和函数提升的总结 我们在学习JavaScript时,会遇到变量提升和函数提升的问题,为了理清这个问题,现做总结如下,希望对初学者能有所帮助 我们都知道 var 声明的变量有变量提升,而 let ...

  9. js关于“变量提升、作用域、私有作用域等知识点”高级解题思路

    var i = 2,    x = 5;var fn = function (x) {    x += 3;    return function (y) {        console.log(( ...

随机推荐

  1. js二叉树,前序/中序/后序(最大最小值,排序)

    function Node(data,left,right) { this.left=left this.right=right this.data=data } function Btr() { t ...

  2. socket短连接、长连接

    通常短连接是这样:连接->传输数据->关闭连接那什么是长连接?一般长连接相对短连接而言的,长连接在传输结束后不关闭连接,而不断的发送包保持连接等待处理下一个数据包. 一般长连接用于少数cl ...

  3. 怎样用EA设计ER图

    我们开发系统从文档開始,而EA就是替我们开发文档的好工具.结束了我们从概念设计到逻辑设计中的非常多问题.完好我们的文档. 如今就给大家说说如何在EA中设计概念模型ER图: 首先打开EA-"新 ...

  4. PHP第五课 自己主动类型转换与流程控制

    学习概要: 1.了解自己主动类型转换的有哪些 2.了解主要的流程控制语句 3.实例:实现日历表格的写法 自己主动类型转换 1)整型转字符串 echo $num."abc"; 2)字 ...

  5. Struts2之类型转换器的使用

    一.学习案例:通过在输入页面(input.jsp)用同一个输入框同一时候输入username和password,通过类型转换器在输出页面(output.jsp)分别输出username和passwor ...

  6. 汉澳Sinox2014X64server高级桌面服务器版操作系统公布

    汉澳Sinox2014X64server高级桌面服务器版操作系统公布   当你在现代城市夜空中看到一道闪电.屏幕中央闪过几个图形,转眼间变成美轮美奂的紫色空中天国,说明你来到了汉澳sinox2014世 ...

  7. linux 磁盘性能监控

    linux下对于查看进程的命令非常多也非常强大.经常使用的如:ps  top 可是在磁盘性能监控方面就没有那么统一了. 以下列举一些磁盘监控命令.此处仅仅是起到抛砖引玉作用,具体使用參数请參考man手 ...

  8. ocpm

    学习中心 | 腾讯社交广告营销平台 http://e.qq.com/ads/learning/data/optimization/case/035/

  9. Knowing When to Use Override and New Keywords (C# Programming Guide)

    https://msdn.microsoft.com/en-us/library/ms173153.aspx In C#, a method in a derived class can have t ...

  10. IOS系统控件高度

    以下是常见的几种控件的高度.Statusbar,Navigationbar和Tabbar的宽度极其图标大小. 下表是更为详细的参数,包括了Statusbar,Navigationbar.Tabbar. ...