第一种理解方式:let和const不能被使用,直到他们被声明

对于var定义的变量,解析器会提升其到作用域顶部。

// Outputs: undefined
console.log(x); var x = "Now it's defined!"; // Outputs: "Now it's defined!"
console.log(x);

对于let定义的变量,在声明之前使用这些变量,就会报错。

"use strict";

// ReferenceError
console.log(x); let x = "Now it's defined!"; console.log(x);

另外ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。

"use strict";

let x = 10;

if (true) {
"use strict"; // ReferenceError
console.log(x); let x = 20; console.log(x);
}

对于函数声明,解析器会提升并定义到作用域顶部。

// Outputs: "Definition hoisted!"
f(); function f() {
console.log("Definition hoisted!");
}

第二种理解方式

所有的定义方式“var, let, const, function, function, class”都存在变量提升,但是var定义的变量被提升初始化为undefined, function/function的变量被提升并被定义相应函数;而let, const, class定义的变量被提升,但没有被初始化,且只能在声明的时候被初始化,不然提前的引用都会报ReferenceError错误。

参考

关于JavaScript的变量和函数提升的更多相关文章

  1. JavaScript中变量和函数声明的提升

    现象: 1.在JavaScript中变量和函数的声明会提升到最顶部执行. 2.函数的提升高于变量的提升. 3.函数内部如果用var声明了相同名称的外部变量,函数将不再向上寻找. 4.匿名函数不会提升. ...

  2. JavaScript局部变量变量和函数命名提升

    之前接触了一些javascript局部变量命名提升的问题但是一直没有总结今天特地好好总结一下 变量提升 一个变量的作用域是程序源代码中定义的这个变量的区域.全局变量拥有全局作用域,在javascrip ...

  3. 关于javascript中变量及函数的提升

    javascript中变量以及函数的提升,在我们平时的项目中其实还是挺常用的,尤其是大型项目中,不知不觉就会顺手添加一些变量,而有时候自己的不小心就会酿成一些不必要错误,趁有时间整理一下自己对于js中 ...

  4. js 变量、函数提升 与js的预编译有关

    参考网址:http://www.codesec.net/view/178491.html 先简单理解下作用域的概念,方便对变量与函数提升的概念的理解 function foo() { var x = ...

  5. js 变量、函数提升

    js 变量.函数提升 先简单理解下作用域的概念,方便对变量与函数提升的概念的理解 function foo() { var x = 1; if (x) { var x = 2; } console.l ...

  6. JS 变量和函数提升 全局变量和局部变量

    变量提升 1. var a = 10; function test() { a = 100; console.log(a); console.log(this.a); var a; console.l ...

  7. javascript对变量和函数的声明提前‘hoist’

    hoist vt.升起,提起; vi.被举起或抬高; n.起重机,升降机; 升起; <俚>推,托,举; 原文地址:http://www.bootcss.com/article/variab ...

  8. js变量和函数提升的小结

    对于变量和函数一起的提升说法,我比较认同"LittleBear"的说法. 比如: <script> console.log(a)//function a(){} var ...

  9. js变量和函数提升

    写在前面: 变量提升是 声明提升,初始化不会提升,比如说 var a=1; console.log(a); 实际是这样执行(个人理解,仅供参考) var a; console.log(a); a=1; ...

随机推荐

  1. Oracle&nbsp;11gr2的完全卸载

    Oracle 11gr2的完全卸载方式与前些版本有了改变,运行D:\app\Administrator\product\11.2.0\dbhome_1\deinstall的deinstall.bat批 ...

  2. 《精通Spring4.X企业应用开发实战》读后感第三章

  3. app.config 配置的一种用法

    app.config文件 <?xml version="1.0" encoding="utf-8" ?> <configuration> ...

  4. 黑马学习Ajax 跨域资源共享 jQuery+jsonp实现

  5. 黑马学习AJAX jQuery发送异步请求 $.ajax() $.post() $.get()是在调用方法而不是定义方法

  6. javascript中的style只能取到在HTML中定义的css属性

    如果在css中定义的 li{ width:100px; left:100px; top:; position:absolute; font-style:normal; } 这样执行: oli[0].s ...

  7. Linux操作学习笔记1

    Linux只有一个根目录/,所有的文件和设备都当成是文件进行管理: pwd 打印当前工作目录 (print working directory) whoami ls  列出当前目录面的文件 ls -l ...

  8. [Leetcode] 002. Add Two Numbers

    https://leetcode.com/problems/add-two-numbers/ public class Solution { public ListNode addTwoNumbers ...

  9. BestCoder Round #81 (div.2) 1003 String

    题目地址:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=691&pid=1003题意:找出一个字符串满足至少 ...

  10. Java带token验证的注册登录

    http://blog.csdn.net/huqingpeng321/article/details/52900550 http://blog.csdn.net/l18710006370/articl ...