预解析:就是在解析代码之前
 

1. 预解析做什么事?

  • 把变量的声明提前了----提前到当前所在的作用域的最上面
  • 函数的声明也会被提前---提前到当前所在的作用域的最上面
 
举例:
    function f1() {
console.log(num);
var num = 10;
}
f1(); //此时运行结果是undefined

此时运行结果是undefined,因为预解析,变量声明被提前了,实际按下面的方式解析的:

    function f1() {
var num
console.log(num);
num = 10;
}
f1(); //此时运行结果是undefined

举例2:

    //函数调用的时候,把会函数的声明提升到作用域的上面
f1();//调用
var num = 20;//这个变量的声明会提升到变量使用之前
function f1() {
console.log(num);
//var num=10;
}

2. 预解析分段和局部作用域的问题

  • 预解析中,变量的提升,只会在当前的作用域中提升,提前到当前的作用域的最上面
  • 函数中的变量只会提前到函数的作用域中的最前面,不会出去
    function f1() {

      console.log(num);//undefined
var num = 10;
}
f1();
console.log(num);//报错
  • 预解析会分段(多对的script标签中函数重名,预解析的时候不会冲突)
  <script>

    function f1() {
console.log("哈哈");
} </script>
<script>
f1();
function f1() {
console.log("嘎嘎");
}
</script>

3. 快速识别预解析的结果

练习1:

    var a = 25;
function abc() {
alert(a);//undefined
var a = 10;
}
abc();
console.log(a);//

练习2:

    console.log(a);
function a() {
console.log('aaaaa');
}
var a = 1;
console.log(a);//

预解析下的代码解读:

(变量声明在最上面,下面是函数声明)

    var a;
function a() {
console.log('aaaaa');
}
console.log(a); //此时输出的是函数a的代码
a = 1;
console.log(a);//

代码结果:

练习3:

    var a = 18;
f1();
function f1() {
var b = 9;
console.log(a);//undefined
console.log(b);//
var a = '123';
}

预解析下的代码解读:

   var a;
a = 18;
function f1() {
var b;
var a;
b = 9;
console.log(a);//undefined
console.log(b);//
a = '123';
}
f1();

代码结果:

练习4:

    f1();
console.log(c);
console.log(b);
console.log(a);
function f1() {
var a = b = c = 9;
console.log(a);
console.log(b);
console.log(c);
}

预解析下的代码解读:

recap:

隐式全局变量: 声明的变量没有var,  就叫隐式全局变量

局部变量: 在函数内部定义的变量,是局部变量, 外面不能使用

   function f1() {
var a;//局部变量
a=9;
//隐式全局变量
b=9;
c=9;
console.log(a);//
console.log(b);//
console.log(c);//
}
f1();
console.log(c);//
console.log(b);//
console.log(a);//报错

代码结果:

练习4:

    f1();//-----报错
var f1 = function () {
console.log(a);
var a = 10;
};

预解析下的代码解读:

    var f1;
f1();//-----报错,不能调用,因为下的f1是赋值的表达式
f1 = function () {
console.log(a); //f1报错,这里就没有结果啦
var a = 10;
};

JS基础语法---预解析的更多相关文章

  1. js作用域其二:预解析

    文章目錄 解析机制 JavaScript是一门解释型的语言 , 想要运行js代码需要两个阶段 编译阶段: 编译阶段就是我们常说的JavaScript预解析(预处理)阶段,在这个阶段JavaScript ...

  2. JavaScript进阶 - 第2章 你要懂的规则(JS基础语法)

    第2章 你要懂的规则(JS基础语法) 2-1什么是变量 什么是变量? 从字面上看,变量是可变的量:从编程角度讲,变量是用于存储某种/某些数值的存储器.我们可以把变量看做一个盒子,盒子用来存放物品,物品 ...

  3. 【JS基础语法】---学习roadmap---6 parts

    JS基础语法---roadmap Part 1 - 2: Part 3 - 4:   Part 5 - 6

  4. JS基础语法(二)

    目录 JavaScript基础语法(二) 八. 函数 1. 函数的概念 2. 函数的使用 声明函数 调用函数 3. 函数的封装 4. 函数的参数 函数的参数匹配问题 5. 函数返回值 6. argum ...

  5. 9.12/ css3拓展、js基础语法、程序基本知识、数据类型、运算符表达方式、语句知识点

    css3拓展: <display:none>  将某个元素隐藏       <visibility:hidden>  也是将某个元素隐藏 <display:block&g ...

  6. JS作用域概念-预解析规则

    // 作用域: // 域:空间.范围.区域…… // 作用:读.写 script 全局变量.全局函数 自上而下 函数 由里到外 {} 浏览器: “JS解析器” 1)“找一些东西” :var funct ...

  7. Vue.js基础语法(一)

    vue学习的一系列,全部来自于表哥---表严肃,是我遇到过的讲课最通透,英文发音最好听的老师,想一起听课就去这里吧 https://biaoyansu.com/i/hzhj1206 前言: 前端解析数 ...

  8. JS中的预解析

    js预解析对于很多学习web前端开发的新手们很困扰,总是很难搞懂到底是个什么东西,今天零度就为大家简单的分析一下,争取让大家都明白! 首先,看一下下面的代码: alert(a); var a = 1; ...

  9. JavaScript01 js基础语法,数据类型

    JavaScript的概述: 1.组成 三部分组成 ecmaScript 基础语法 (es5) dom document object model 文档对象模型 (操作html文档内容) bom bo ...

随机推荐

  1. java正则表达式大全(常用)

    一.校验数字的表达式 数字:^[-]*$ n位的数字:^\d{n}$ 至少n位的数字:^\d{n,}$ m-n位的数字:^\d{m,n}$ 零和非零开头的数字:^(|[-][-]*)$ 非零开头的最多 ...

  2. BASH Shell 文件管理

    BASH Shell 对文件进行管理 ========================================================创建.复制.删除.移动.查看.编辑.压缩.查找 内 ...

  3. AVProVideo 在android 真机使用经验分享

    AVProVideo 在 android 方面 如果想使用必须进行合理的设置:如图 发布的时候设置: 如果想使用代码替换播放视频: 第一步:设置  PlatformOptionsAndroid.ove ...

  4. leetcode菜鸡斗智斗勇系列(1)---把一个链表中的二进制数字转换为一个整型数(int)

    Convert Binary Number in a Linked List to Integer这道题在leetcode上面算作是“easy”,然而小生我还是不会做,于是根据大佬的回答来整理一下思路 ...

  5. 使用 Docker 和 Nginx 打造高性能的二维码服务

    使用 Docker 和 Nginx 打造高性能的二维码服务 本文将演示如何使用 Docker 完整打造一个基于 Nginx 的高性能二维码服务,以及对整个服务镜像进行优化的方法.如果你的网络状况良好, ...

  6. 提升代码幸福度,五个技巧减少js开发中的if else语句

     壹 ❀ 引 在JavaScript开发中,条件判断语句的使用频率是极高的,而对于条件判断简单易读的if else应该都是大家的首选.可是代码写的久了,我们总是希望自己的代码看着能更为简洁规范(逼格更 ...

  7. 入职小白随笔之Android四大组件——服务(Service)

    Service Android多线程编程 当我们在程序中执行一些耗时操作时,比如发起一条网络请求,考虑到网速等原因,服务器未必会立刻响应我们的请求,此时我们就需要将这些操作放在子线程中去运行,以防止主 ...

  8. Scrum Framework, Process and Story Point

    Scrum Framework Roles Ceremonies Artifacts Scrum Master Sprint Planning Product Backlog Product Owne ...

  9. ORDER BY导致索引使用不理想

    在MySQL中经常出现未按照理想情况使用索引的情况,今天记录一种Order by语句的使用导致未按预期使用索引的情况. 1.  问题现象 1.1 SQL语句: SELECT DISTINCT p.* ...

  10. Linux后台运行和关闭jar项目

    直接用java -jar xxx.jar,当退出或关闭shell时,程序就会停止掉.以下方法可让jar运行后一直在后台运行. java -jar server.jar & 如果想要关闭java ...