console.log( a );
var a = 2;

执行输出undefined

a = 2;
var a;
console.log( a );

执行输出2

说明:javaScript 运行时在编译器阶段会最先处理var a;也就是变量被提升

foo();
function foo() {
console.log( a ); // undefined var a = 2;
var a = 2;
}

执行输出undefined,执行foo();时找到了函数的声明,但实际代码写在foo()的后面。说明函数声明会被提升,函数作用域里变量也会被提升

foo();
var foo = function bar() {
console.log(a)
var a =2
};

执行输出TypeError: foo is not a function,说明函数表达式不会被提升,foo() 由于对 undefined进行调用抛出TypeError异常

var foo;
foo(); // 1
foo = function() {
console.log( 2 );
};
function foo() {
console.log( 1 );
}

执行输出1,说明虽然函数和变量都能被提升,但是函数声明提升优先于变量声明提升

foo(); // 3
function foo() {
console.log( 1 );
}
var foo = function() {
console.log( 2 );
};
function foo() {
console.log( 3 );
}

执行输出3,后面的函数声明会覆盖前面的函数声明

总结

var 变量声明和函数声明其实跟javaScript运行原理有关,在javaScript运行之前会先进行编译,在编译阶段会先为变量和函数根据作用域规则开辟内存空间并初始化变量为undefined,而函数是初始化函数变量并且直接赋值函数体,以便在执行的时候方便查找和存储。

let , const到底有没有有变量提升?

console.log(a)
let a=2

输出:ReferenceError: Cannot access 'a' before initialization,表明变量没有被定义,不能在变量为初始化之前使用。其实从这句话看来js是找到了变量a的,但a还没有被初始化;这样看来,let其实也有变量提升(在我理解上来说,提升就是先为变量创造内存空间),js 处理let声明变量的过程:

{
let x = 1
x = 2
}

1、查找let声明的变量x,并在作用域中创建变量,不进行初始化

2、执行代码x=1,初始化为1

3、执行x = 2赋值为2

let 特性

let a=2
let a=3
console.log(a)

输出:SyntaxError: Identifier 'a' has already been declared,不能重复定义变量

参考资料

《你不知道的javaScript 上卷》第四章 变量提升

【你不知道的javaScript 上卷 笔记3】javaScript中的声明提升表现的更多相关文章

  1. 你不知道的JavaScript上卷笔记

    你不知道的JavaScript上卷笔记 前言 You don't know JavaScript是github上一个系列文章   初看到这一标题的时候,感觉怎么老外也搞标题党,用这种冲突性比较强的题目 ...

  2. 【你不知道的javaScript 上卷 笔记2】 javaScript 的作用域规则

    一.什么是词法作用域? 词法作用域是在定义词法阶段的作用域,就是由代码变量和作用域块写在哪里决定的,基本上词法分析器在处理代码时会保持作用域不变. 二.词法作用域特点 完全由写代码期间函数所声明的位置 ...

  3. Javascript学习笔记1 javascript的特点

    ..对于网页而言,Javascript无处不在,对于英语不好的人它简直是噩梦般的存在,但形式所逼,今天开始着手学习!希望自己能坚持下去.从什么地方着手,我的目标是从大处着眼,从应用着眼,不抠细节,反正 ...

  4. JavaScript学习笔记(4)——JavaScript语法之变量

    一.变量可以使用短名称(比如 x 和 y),也可以使用描述性更好的名称(比如 age, sum, totalvolume). 变量必须以字母开头 变量也能以 $ 和 _ 符号开头(不过我们不推荐这么做 ...

  5. 1.2(JavaScript学习笔记)JavaScript HTML DOM

    一.DOM DOM全称为document object model(文档对象模型). 此处的文档指当前HTML文档,对象指HTML标签. 当网页被加载时,浏览器会创建页面的文档对象模型. 下面结合具体 ...

  6. Javascript学习笔记3 Javascript与BOM简介

    什么是BOM BOM是browser object model的缩写,简称浏览器对象模型 BOM提供了独立于内容而与浏览器窗口进行交互的对象 由于BOM主要用于管理窗口与窗口之间的通讯,因此其核心对象 ...

  7. 【你不知道的javaScript 上卷 笔记7】javaScript中对象的[[Prototype]]机制

    [[Prototype]]机制 [[Prototype]]是对象内部的隐试属性,指向一个内部的链接,这个链接的作用是:如果在对象上没有找到需要的属性或者方法引用,引擎就 会继续在 [[Prototyp ...

  8. 【你不知道的javaScript 上卷 笔记6】javaScript中的对象相关内容

    一.创建一个对象的语法 var myObj = { key: value // ... };//字面量 var myObj = new Object(); //new myObj.key = valu ...

  9. 【你不知道的javaScript 上卷 笔记5】javaScript中的this词法

    function foo() { console.log( a ); } function bar() { var a = 3; foo(); } var a = 2; bar(); 上面这段代码为什 ...

随机推荐

  1. Shiro -- (一)简介

    简介: Apache Shiro 是一个强大易用的 Java 安全框架,提供了认证.授权.加密和会话管理等功能,对于任何一个应用程序,Shiro 都可以提供全面的安全管理服务.并且相对于其他安全框架, ...

  2. Kubernetes CI/CD(2)

    本章节通过在Jenkins创建一个kubernetes云环境,动态的在kubernetes集群中创建pod完成pipeline的构建流程,关于直接在宿主机上搭建Jenkins集群的可参照Kuberne ...

  3. Visual Studio Code中C/C++的环境配置

    Visual Studio Code 的功能十分强大,但是对我这种小白不是很友好,它和其它的集成开发工具不同,Visual Studio Code (以下简称VS)自身其实仅仅是一个编辑器, 是不具备 ...

  4. yarn-site.xml 配置介绍

    yarn-site.xml 配置介绍 yarn.scheduler.minimum-allocation-mb yarn.scheduler.maximum-allocation-mb 说明:单个容器 ...

  5. 字段类型(uniqueidentifier)问题

    环境:SQL 2016: 语句 select * from A where PID=JoID 上述查询语句中的Where PID=JoID条件中PID的字段类型为varchar(50)而JoID的字段 ...

  6. 如何获取 iOS APP 的 scheme URL ?

    获取IPA文件 拷贝到桌面上 后缀名由 .ipa 改为 .zip 解压之后进入,进入名为Payload的目录 右键点击里面的跟App同名的文件,选择'显示包内容' 用文本编辑器打开当前文件夹下的inf ...

  7. 整理了Linux常用命令变量

    查看信息命令 ls 查看当前目录下面的所有文件 -a 显示所有文件(包括隐藏文件) -l 显示所有文件(包括文件的详细信息) 格式: ls 参数 目录路径(绝对/相对) cd 切换目录 格式: cd ...

  8. vue实现打印功能

    通过npm 安装插件 1.安装  npm install vue-print-nb --save 2.引入  安装好以后在main.js文件中引入 import Print from 'vue-pri ...

  9. 剑指offer-面试题36-二叉搜索树与双向链表-中序遍历

    /* 题目: 将二叉搜索树转化为排序的双向链表,不能创建新的节点, 只能调整节点的指向,返回双向链表的头节点. */ /* 思路: 递归. 二叉搜索树的中序遍历得到的序列是递增序列. 左子树left& ...

  10. 小程序tabbar和navigator一起使用点不动

    在项目开发中我遇到这样的一个问题,页面需要navigator链接跳转一个页面,tabbar也需要导航到这个页面,最开始还没有添加tabbar的时候,navigator都能够正常跳转,但是当加上tabb ...