精华内容
下载资源
问答
  • const、let声明的变量会提升

    千次阅读 2019-01-10 18:55:27
    const、let是ES6的新特性,可以...var 声明的变量会提升到顶部,再赋值console.log(a) var a = 1 // undefined const、let会在声明地方到块级顶部形成临时性死区,在这区间使用该变量都会被报错console.log(a...

    const、let是ES6的新特性,可以声明块级作用域

    • 到底会不会声明被提升,现在说法不一
    • 个人认为也不会被提升,但是和var一样不能先使用再声明
    • var 声明的变量会被提升到顶部,再赋值
      console.log(a) 
      var a = 1
      // undefined
      
    • const、let会在声明地方到块级顶部形成临时性死区,在这区间使用该变量都会被报错
      console.log(a)
      let a = 1
      // VM92:1 Uncaught SyntaxError: Identifier 'a' has already been declared
      
      ES6规定如果块内存在let命令,那么这个块就会成为一个封闭的作用域,并要求const、let变量先声明才能使用,如果在声明之前就开始使用,它并不会引用外部的变量。
    • 用法总结
      const一般用来声明常量,且声明的常量是不允许改变的,只读属性,因此就要在声明的同时赋值。const与let一样,都是块级作用域,存在暂时性死区,不存在变量声明提前,不允许重复定义,不会成为全局对象的一个属性。

    更新

    const、let会不会被提升,我犹豫了

    提升 — 关键是怎么定义提升的
    要理解提升的定义,还需要搞懂js变量的执行过程

    js变量的执行过程包括

    创建 =》初始化 =》 赋值
    

    var 声明的变量执行过程

    找到当前作用域中所有var声明的变量,创建变量 =》初始化为 undefined =**执行代码** =》 赋值
    

    function 声明的变量执行过程

    找到当前作用域中所有function声明的变量,创建变量 =》初始化 =》赋值 =**执行代码**
    

    let 声明的变量执行过程

    找到当前作用域中所有let声明的变量,创建变量 =**执行代码** =》初始化为let声明的值,没有就为undefined  =》 赋值(修改值)
    

    const 声明的变量执行过程

    找到当前作用域中所有let声明的变量,创建变量 =**执行代码** =》初始化为let声明的值,没有就为undefined
    

    const 没有赋值过程

    有没有被提升,主要看代码执行的时机

    • let 的「创建」过程被提升了,但是初始化没有提升。
    • var 的「创建」和「初始化」都被提升了。
    • function 的「创建」「初始化」和「赋值」都被提升了。

    深入了解,请参考https://zhuanlan.zhihu.com/p/28140450

    展开全文
  • let声明的变量--详解

    2019-10-15 14:45:48
    let声明的变量具有以下特性: (1)具有块级作用域。 (2)使用let声明的全局变量(全局变量:全局范围内有效),不会成为window对象的属性。 (3)没有变量提升。 (4)变量名不能重复声明,报错(var已经...

    let声明的变量具有以下特性:

    (1)具有块级作用域。

    (2)使用let声明的全局变量(全局变量:全局范围内有效),不会成为window对象的属性。

    (3)没有变量提升。

    (4)变量名不能重复声明,会报错(var已经声明的变量名,let也不能重复声明)。

    ps:如果访问一个对象不存在的属性,不会报错,只会出现undefined.

    参照:https://blog.csdn.net/fang_ze_zhang/article/details/83419022

     

     

    展开全文
  • 使用let声明变量

    2020-01-18 12:01:50
    es5声明变量的问题 1.全局变量挂载到全局对象:全局对象成员污染问题。 let声明的变量不会挂载到全局对象。...底层实现上,let声明的变量实际上也提升,但是,提升将其放入到“暂时性死区”,如果访问的...

    es5声明变量的问题

    1.全局变量挂载到全局对象:全局对象成员污染问题。
    let声明的变量不会挂载到全局对象。

    2.允许重复的变量声明,导致变量被覆盖。
    let声明的变量不允许当前作用域范围内重复声明。

    3.变量提升:怪异的数据访问,闭包问题。

    使用let不会有变量提升,因此,不能在定义变量之前使用它

    底层实现上,let声明的变量实际上也会有提升,但是,提升后会将其放入到“暂时性死区”,如果访问的变量位于暂时性死区,则会报错。当代码运行到公司变量的声明语句时,会将其从暂时性死区移除。

    在循环中,用let声明的循环变量会特殊处理,每次进入循环体都会开启一个新的作用域,并且将循环变量绑定到该作用域(每次循环,使用的是一个全新的循环变量)。

    在循环中使用let声明的循环变量,在循环结束后会销毁。

     for (let i = 0; i < 10; i++) {            
    	 var btn = document.createElement('button');            
    	 btn.innerHTML = "按钮"  + i;
    	 document.getElementById('main').appendChild(btn);            
    	 btn.onclick = function(){                
    	 	console.log(i)            
    	 }                   
     }
     console.log(i)     //报错        
     console.log(name); //报错        
     let name = "abc";
    
    展开全文
  • 1、变量声明前调用,为什么var 不会报错,let 报错? var 定义变量的时候,js是首先直接把变量声明到作用域最顶部,所以这个时候,全局都能找到这个变量 所以在定义之前调用这个变量,是不会报错。所以...

    1、变量在声明前调用,为什么var 不会报错,let 会报错?

    var 定义变量的时候,js是首先直接把变量声明到作用域的最顶部的,所以这个时候,全局都能找到这个变量

    所以在定义之前调用这个变量,是不会报错的。所以为了纠正这个问题,在ES 提出了let 这个解决方案。

    let 是必须先声明,然后才可以引用的,否则程序会中断,不会继续往下进行。

    // var 的情况
    console.log(foo); // 输出undefined
    var foo = 2;
    
    // let 的情况
    console.log(bar); // 报错ReferenceError
    let bar = 2;

     2、什么是变量提升?

    用个最简单的例子来说明一下:这个例子的左边代码是全等于右边的代码的。

    这就解释了var 定义变量的时候,js是首先直接把变量声明到作用域的最顶部的原因了。

    展开全文
  • var声明的变量会挂载在window上,而let和const声明的变量不会挂载到window上,它形成了一个块作用域 是否存在变量提升 var声明变量存在变量提升let和const不存在变量提升 是否形成块作用域 let和const声明形成...
  • ES6 中的let 声明变量

    2017-05-11 14:49:00
    1、let声明的是块级变量,不会污染全局,一般条件与循环中用到; 2、let 不可以变量提升; 3、let不遵循作用域,一个作用域内如果有该变量,就不会到全局去找,也不可以在一个作用域重复声明一个变量。 转载于...
  • 但是let不会变量提升,什么是变量提升呢,变量提升简单理解就是变量的声明会提升到当前作用域顶端。下面一个简单例子你就可以理解了。 console.log(food) var food = '土豆鸡蛋' console.log(food) let ...
  • 使用var声明变量 允许重复的变量声明:导致数据被覆盖 变量提升:怪异的数据访问、闭包问题 ...let声明的变量不会挂载到全局对象 允许重复的变量声明:导致数据被覆盖 let声明的变量,不允许当前作用域
  • 在js中存在着变量声明提升,在var声明的情况下,先定义变量赋值,后声明,程序并不会报错;且正常运行;在es6中已新增const,let两种声明方法,在此声明中不会出现声明提升的现象,若如此则有报错,使程序无法运行...
  • 声明变量的方法var、let、const不用以上关键字直接赋值的变量会挂载与windows环境下;let a=9const a=1vara=6c=5声明函数的方法javascript中声明函数的方法有两种:函数声明式和函数表达式。//函数...
  • 在声明前先打印,不会报错,输出undefined,原因是JavaScript 将var 声明的变量提升占位 let 声明变量 块级作用域 ES6之前的作用域       全局作用域   &n
  • JS变量提升以及var和...JavaScript 只有声明的变量会提升,初始化的不会。 比如: var x = 5; // 初始化 x elem = document.getElementById("demo"); // 查找元素 elem.innerHTML = x + " " + y; // 显示 x 和 y v
  • 我们看下面的代码:变量声明这种变量提升机制在开发时给我们造成很多的困扰,ECMAScript 6引入了let声明,用法与var相同,不过用let声明的变量不会被提升,可以把变量的作用域限制在当前代码块中。我们将上述代码...
  • var和let/const的区别块级作用域不存在变量提升暂时性死区不可重复声明let、const声明的全局变量不会挂在顶层对象下面const命令两个注意点:const 声明之后必须马上赋值,否则报错const 简单类型一旦声明就不能再...
  • 需要注意,只有声明的变量会提升,初始化的不会。 x=6; console.log(x); var x; //声明变量x //控制台输出6 console.log(x); var x = 6; //初始化x //控制台输出 undefined for循环中let和var的区别 (这个问题在...
  • 1、通过let声明变量不会变量声明提升 let a = 10; console.log( a ) 会报错 2、 let a = 10; let a = 10; 报错,(a 已被定义) 3、 let a = 10; console.log( window.a ) 》 undefind let 声明的变量...
  • 简要归纳:1、分声明和赋值两种情况。声明提升到头部执行,赋值留在原地。2、变量声明:var a; 变量赋值 : var a=10;...4、用let进行的声明不会在块作用域中进行提升。1、JavaScript引擎首先扫...
  • 2、let声明的变量不会声明提升,var声明提升 3、从代码的写法上,let不能声明同名的变量,var可以。 let和const都可以声明变量,let声明的变量可以修改,const修饰的变量不能修改。 当然,此时就需要对比let和var...
  • 变量提升:JS执行前先要进行编译,编译时就将变量收集并提前声明 var 声明变量,作用域全局。 发生变量提升,值为undefined let 声明变量,作用域块内。不会提升,声明后可用,否则抛ReferenceError const 声明...
  • 使用var声明变量 ...使用let声明的变量 不会挂载到全局对象 不允许当前作用域范围内重复声明 在块级作用域中用let定义的变量,在作用域外不能访问 使用let不会变量提升,因此,不能在定义let变量之前
  • 一、var声明的变量会挂载在window上,而let和const声明的变量不会: var a = 100; console.log(a,window.a); // 100 100 let b = 10; console.log(b,window.b); // 10 undefined const c = 1; console.log(c,...
  • Let(定义变量) 在es5中我们声明变量一般是使用var,然而var具有变量...如果变量声明时给了初始值,那么值不会被提升,提升到最顶部的变量是一个未初始化值的变量 变量提升带来的问题 var ar=[]; for (var i = 0...
  • let 和 var 的区别? let不存在变量提升 let不允许重复声明 let会产生块级作用域 暂时性死区的问题 ...typeof 检测一个未被声明的变量不会报错,结果是undefined 这个bug的应用 检测js的运行环境,判断是node环
  • 预解析阶段就是先读取一下你代码,看看有没有语法错误,如果有语法错误,那么整个script内js文件都不会执行了,而且在与解析阶段还执行变量提升,通常是先声明变量,后使用变量,使用var 声明了一个变量,但是...
  • Javascript中声明变量 var特点: var特点: 变量声明提升 可重复声明 ...产生一个块级作用域,在块级元素中用let定义的变量只能在当前块级作用域中使用(注:凡是用{}包裹的都是块级作用域,但是
  • what 变量提升 在js中只有两种作用域全局作用域+函数作用域 在ES6之前,js是没有块级作用域。 JavaScript 代码执行分为两个...var 可以变量提升let不会,notice( 变量提升不可以跨script 函数优先于变量先提升...
  • 变量提升

    2020-08-14 23:31:44
    答案之一就有 let 不会变量提升 函数提升 函数优先于变量 先提升 console.log(foo); var foo=10; console.log(foo); function foo(){ } console.log(foo); 执行结果: function a(){ } var a; conso
  •   用var声明的变量都是变量,都是可变的,我们可以随便对它进行运算操作。这样当多个人进行同一个项目时,区分变量和常量越来越难,一不小心就把设计为常量的数据更改了。 允许重新声明   在相同作用域下用...
  • var的变量提升

    2020-08-16 20:27:36
    他是报错,因为let没有变量提升的特性。console时候,他没有找到a这个变量。所以他报错 现在换成var console.log(a) var a= 1 他不会报错,但是打印出undefined 翻译一下,上面var,等同于下面这一段 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 421
精华内容 168
关键字:

let声明的变量会不会变量提升