ES5没有块级作用域造成的结果

ES5只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景。

第一种场景,内层变量可能会覆盖外层变量。

var tmp = new Date();function f(){
  console.log(tmp);
  if (false){
    var tmp = "hello world";
  }}f() // 没有输出

上面代码中,函数f执行后没有任何输出,原因在于变量提升,导致内层的tmp变量覆盖了外层的tmp变量。

第二种场景,用来计数的循环变量泄露为全局变量。

var s = ‘hello‘;for (var i = 0; i < s.length; i++){
  console.log(s[i]);}console.log(i); // 5
时间: 2024-11-08 21:09:57

ES5没有块级作用域造成的结果的相关文章

块级作用域问题ES5 &amp; ES6

1.  没有块级作用域 在其他类C语言中,由花括号封闭的代码块都有自己的作用域(如果用ECMAScript的话来说,就是它们自己的执行环境), 所以支持根据条件来定义变量. ES5: if(true){ var color = 'blue'; } console.log(color); //'blue' 这里是在一个if语句中定义了变量color.如果是在C.C++或Java中,color会在if语句执 行完毕后被销毁.但在JavaScript中,if语句中的变量声明会将变量添加到当前的执行环境

浅谈块级作用域

在ES5里面其实是没有块级作用域,这个说法的,但是也有特殊,从ES3开始的try.catch中是有块级作用域的. 例: 1 try { 2 throw undefined; 3 } catch(a) { 4 a = 2; 5 console.log(a); 6 } 7 console.log(a); 同样,这个写法是目前使用代码转换工具来ES6代码处理,生成兼容ES5的代码.

es63块级作用域

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>第一种场景</title> <script type="text/javascript"> ----------------------------------------------------------------- v

ES6标准入门 第二章:块级作用域 以及 let和const命令

一.块级作用域 1.为什么需要块级作用域? ES5中只有全局作用域和函数作用域,带来很多不合理的场景. (1)内层变量可能会覆盖外层变量: var tem = new Date(); function f(){ console.log(tmp); if(false) { var tmp = "hello world"; } } f(); //undefined 变量提升导致了外层的内层的tmp变量覆盖了外层的tmp变量. (2)用来计数的循环变量泄露为全局变量: var s = &qu

使用try创建块级作用域

这个只作为了解,不推荐使用,最大的有点就是在ECMAScript3就存在了. ES6已经新增了let命令,实际上为我们添加了块级作用域,在ES5之前是没有的,不过可以使用这种方法来实现. 比如下面这个例子, ES6是这样写的 { let a = 20; console.log(a); } console.log(a); 这里最后一行代码会报错,因为上面只在{}代码块内有效. 用try实现 try { throw 20; } catch (e) { console.log(e); } consol

闭包和let块级作用域

还是先从一个题目开始: 写一个隔1s输出数组的一项的函数. 如果可以用ES6语法,则可以这么写: function print (arr) { for (let i = 0; i < arr.length; i++) { setTimeout(() => { console.log(arr[i]) }, 1000 * i); } } 但是如果把这里的let改成var,则输出就会变成一连串的undefined. 有同学很快想到了这是闭包啊,因为setTimeout把函数加入到microqueue

ES6入门一:块级作用域(let&amp;const)、spread展开、rest收集

let声明 const声明 块级作用域 spread/rest 一.let声明与块作用域 在ES6之前,JavaScript中的作用域基本单元就是function.现在有了let就可以创建任意块的声明,也被称为作用域块.这意味者只需要“{}”就可以创建一个作用域.不再像var声明变量那样总归属于包含函数或全局.例如: 1 var a = 2; 2 { 3 let a = 3 4 console.log(a); //3 5 } 6 console.log(a); //2 在相关的资料中看到有介绍,

12.24 ES6浅谈--块级作用域,let

第一部分:ES6新增了块级作用域,let关键字用于声明变量,相较于var而言,let关键字不存在声明提前. 1.ES6真正的出现了块级作用域,使用双花括号括住并在其中用let声明变量,会存在暂时性死区,在作用域外面使用变量会报错. 2.在循环中,如for循环,let命令相较于var命令会更好,原因在于所声明的变量不会提前到全局.那么在循环结束以后再调用该变量将无法访问. 3.如果是使用var的for循环,如 var a = []; for (var i = 0; i < 10; i++) { a

面试时面试官想要听到什么答案 关于es6中let、const、promise、块级作用域的问题

前言 前面写了一篇关于vue方面问题的面试题(面试时面试官想要听到什么答案(关于一些vue的问题)),感谢大家的阅读和意见,今天整理了一下我面试时经常会问到的一些关于es的问题,写了这篇文章,感谢拨冗翻阅拙作,敬请斧正.因为最近比较忙es6的问题就写了这些,写的比较水了,这些也是我比较常问的还有一些比较碎的内容面试问了但本文未体现只挑选了重点的,class和symbol也是两个重点,因为我了解不深所以就没有去问这两个 - -下面进入正文,本文会列举一些平时面试时问到的问题和答案,并说明我在当时问