1. 程式人生 > >es6學習筆記--塊級作用域

es6學習筆記--塊級作用域

<script type="text/javascript">
		
	/*
	* es5只有全域性作用域和函式作用域,沒有塊級作用域
	* es6 新增塊級作用域,外層塊級作用域無法讀取內層塊級作用域中let,const申明的變數
	* 函式申明最好在全域性變數中申明,理論上塊級作用域中申明的函式類似let申明的函式,對作用域之外沒有影響,但瀏覽器實現並沒
	* 有遵循改該規則,函式申明類似var變數申明,存在變數提升
	*/
	{
		var a = 10;
		let b = 20,
			c = 30;
		const d = 40,//const定義常量申明時必須賦值
			constObj = {
				a: 'yy'
			};
		console.log(a,',',b);//10,20
		var a = 'aa';
		//let b = 'bb';//SyntaxError,同一作用域內不能重複申明相同變數
		//var b = 'bb';//SyntaxError,同一作用域內不能重複申明相同變數
		//d = 'gg';//TypeError,const 定義基本型別常量不能修改
		constObj.a = 'gg';
		console.log(constObj);//gg,定義引用型別常量可以修改屬性值,不能整個修改修改
		//constObj = {};//TypeError
		{
			//b = 'some valeus';
			//ReferenceError,同一作用域內變數必須先申明後使用,後面的let申明綁定了該作用域,不存在變數提升
			//console.log(d);//ReferenceError,同let申明

			var a = 100;
			let b = 200;
			const d = 'inner var';
			console.log(a,',',b);//100,200
			console.log(c);//內層作用域可以訪問外層
		}
	}
	console.log(a);//100
	//console.log(b,d);//ReferenceError,let,const申明的變數只在程式碼塊內有效

	/*
	* for迴圈的迴圈變數部分是外層作用域,迴圈體屬內部作用域
	*/
	var arr = [];
	for(let i = 0,str = 'loop'; i < 10;i++){

		let str = 'inner loop';
		//arr[i] = function(str = 'params'){//SyntaxError,函式引數申明和函式體同屬一個作用域,引數申明預設使用let
		arr[i] = function(){
			let str = 'function body';
			console.log(i);
			console.log(str);
		}

	}

	arr[4]();
	//4
	//function body

	/*
	* 全域性var,function 申明的變數依舊屬於window屬性
	* es6中全域性let,const申明的變數則不再屬於window屬性
	*/
	var global_a = 'aa';
	let global_b = 'bb';
	const global_c = 'cc';
	function foo(){}
	console.log(window.global_a);//aa,
	console.log(window.global_b);//undefined
	console.log(window.global_c);//undefined
	console.log(window.foo);//function foo

</script>