zoukankan      html  css  js  c++  java
  • ES6 let和const命令(2)

    为什么要使用块级作用域

    在ES5中只有全局作用域和函数作用域,没有块级作用域,因此带来了这些麻烦

    1. 内层变量可能会覆盖外层变量
    	    var tmp = new Date();
    	    console.log(tmp);//Thu Jan 12 2017 15:47:08 GMT+0800 (中国标准时间)
    	    function f() {
    	    	console.log(tmp);//undefined
    	    	if (false) {
    	    		var tmp = "hello world";
    	    		console.log(tmp);
    	    	}
    	    	else {
    	    		tmp = "ff";
    	    		console.log(tmp);//ff
    	    	}
    	    }
    	    f();
    	    //结果:Thu Jan 12 2017 15:47:08 GMT+0800
    	    //undefined
    	    //ff
    

    上面代码中,输出undefined是因为变量提升导致了内部的tmp变量覆盖了外层的tmp变量。
    2. 用来计数的循环变量泄露为全局变量

    	    var s = 'hello';
    	    for(var i = 0;i<s.length;i++) {
    	    	console.log(s[i]);
    	    }
    	    console.log(i);//5
    

    上面代码中,变量i只用来控制循环。但是循环结束后,它并没有消失,而是泄露成成了全局变量

    ES6的块级作用域

    1. let实际上为js新增的块级作用域
    	    function f1() {
    	    	let n = 5;
    	    	if(true) {
    	    		let n = 10;
    	    	}
    	    	console.log(n);
    	    }
    	    f1();//5
    

    结果输出5,代表外层代码块不受内层代码块的影响
    2. ES6允许块级作用域任意嵌套

    1. 外层作用域无法读取内层作用域的变量
            function f1() {
    	    	{{
    	    		let a = 10;
    	    	}
    	    	console.log(a);//报错
    	       }
    	    }
    	    f1();
    
    1. 内层作用域可以定义外层作用域的同名变量
    2. 块级作用域的出现,实际上使得广泛应用的立即执行匿名函数(IIFE)不再必要了。
    (function() {
    	    	var tmp = ...;
    	    	...
    	    }());
    	    //块级作用域写法
    	    {
    	    	let tmp = ...;
    	    	...
    	    }
    
    1. ES6规定,函数本身的作用域在其所在的块级作用域之内。
    function f1() {console.log('I am out');}
    	    (function () {
    	    	if(false) {
    	    		//重复声明一次函数f
    	    		function f() {
    	    			console.log('I am in');
    	    		}
    	    		f();
    	    	}
    	    }())
    

    上面的代码在es5中运行会得到“I am in”,但在ES6中会得到“I am out”.这是因为ES5存在变量提升,不管会不会进入到if代码块,函数都会提升到当前作用域的顶部而得到执行;而ES6支持块级作用域,不管会不会进入if代码块,其内部声明的函数都不会影响到作用域的外部。

    {
            	let a = 's';
            	function f() {
            		return a;
            	}
            }
            f();//报错
            
    

    上面代码中,块级作用域外部无法调用块级作用域内部定义的函数。如果确实需要调用,可以用下面方法

    
            let f;
            {
            	let a = 's';
            	f = function () {
            		return a;
            	}
            }
            f()//'s'
    

    需要注意的是,如果在严格模式下,函数只能在顶层作用域和函数内声明,其他情况(比如if代码块,循环代码块)中调用都会出错。

    若到江南赶上春,千万和春住
  • 相关阅读:
    第一节:SpringMVC概述
    SpringMVC【目录】
    Windows 系统快速查看文件MD5
    (error) ERR wrong number of arguments for 'hmset' command
    hive使用遇到的问题 cannot recognize input
    Overleaf支持的部分中文字体预览
    Understanding and Improving Fast Adversarial Training
    Django2实战示例 第十三章 上线
    Django2实战示例 第十二章 创建API
    Django2实战示例 第十一章 渲染和缓存课程内容
  • 原文地址:https://www.cnblogs.com/huyuzhu/p/6492002.html
Copyright © 2011-2022 走看看