• 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代码块,循环代码块)中调用都会出错。

    若到江南赶上春,千万和春住
  • 相关阅读:
    EF性能之关联加载
    【迁移】—Entity Framework实例详解
    GRIDVIEW多行多列合并单元格(合并列)
    使用Word2013发布随笔到博客园
    课堂资料下载-有问题加群-为杜绝有广告泛滥.固加群收费.
    strstr ShellCode实现
    X86保护模式入门简介
    WDK7600编译器环境配置
    内核驱动驱动对象 Driver_OBJECT
    基本的三角函数总结
  • 原文地址:https://www.cnblogs.com/huyuzhu/p/6492002.html
Copyright © 2020-2023  润新知