JavaScriptはメモの役割領域(三)-関数スコープとブロックの役割領域を勉強します.


3.1関数のスコープ
関数のスコープとは、この関数に属するすべての変数が、関数全体の範囲で使用され、多重化されるという意味です.
 
3.2内部実装を隠す
书かれたコードから任意のセグメントを取り出し、関数宣言で包装します.実はこれらのコードを隠しています.
つまり、このコードの中のいかなる声明(変数または関数)も、この新しく作成した包装関数の作用領域に結びつけられます.そして、この機能領域を使って彼らを隠します.
 
なぜ彼らを隠すのですか?
多くの原因がこのような方法を促しました.一番小さい利権の原則から、最小授権または最小暴露原則とも言われています.
この原則はソフトウェア設計において、必要な内容を最小限に暴露すべきであり、他の内容をすべて「隠し」にすることです.例えば、モジュールやAPIの設計です.
衝突を回避する
「非表示」のスコープ内の変数と関数によってもたらされる別の利点は、同名の識別子間の衝突を回避することができ、2つの識別子は同じ名前を持っていても用途が違っていても、意図的に命名の衝突を引き起こす可能性があり、衝突によって変数の値が意図的にカバーされることがある.

function foo() {
	function bar(a) {
		i = 3; //  for         i
		console.log(a + i);
	}
	for(var i = 0; i < 10; i++) {
		bar(i * 2); //  ,     !
	}
}

bar(..) i=3 foo(..) for i。 。

,var i ( foo i) , , ,

1、

。 , ,

, 。 , ( ) , 。

2、

, 。 , , 。

 

3.3

, , “ ” , 。

 


var a = 2;

function foo() {//

, , 。 , foo(), foo 。 , (foo()) 。

( ), , 。

JavaScript :


var a = 2;
(function foo() { //

, (function... function 。

  • (foo) , foo()
  • foo ,

,(function foo(){...}) foo ... 。foo 。

3.3.1

( )


setTimeout(function() {
	console.log("I waited 1 second!")
}, 1000);

, function().. 。 , ( JavaScript )

  1. , 。
  2. , arguments.callee , , 。
  3. / 。

, 。

3.3.2


var a = 2;
(function foo() {
	var a = 3;
	console.log(a) //3
})();//

() , function foo(){..})()

() , () 。

:IIFE(Immediately Invoked Function Expression), 。

:(function(){..}()) 。 () () , , 。

 

IIFE 。


var a = 2;
(function IIFE(global) {
	var a = 3;
	console.log(a);
	console.log(global.a); //2
})(window);
console.log(a); //2

windows , global, 。

IIFE undefined ( , )

(function(undefined){})()

undefined undefined;

IIFE , , IIFE


(function IIFE(def){
    def(window);
})(function def(global){
    ..
})

 

3.4

, 。

for if var , 。

3.4.1 with

with with 。

3.4.2 try/catch

ES3 ,try/catch , catch 。


try{
	undefined();
}catch(err){
	//TODO handle the exception
	console.log(err);//     
}
console.log(err);//ReferenceError: err not found

3.4.3 let

ES6 let , var 。

let ( {..} )。 ,let 。

let , , 。


var foo = true;
if(foo) {
	{//

, if , , if 。(if(){var a;if(a..){}} if(){var a;}if(a..){}, let )。

:let 。 , 。( 。)

1.


function process(data) {
	///...
}

var someReallyBigData = { ...
};

process(someReallyBigData);

$("#my_btn")[0].addEventListener("click", function(evt) {
	console.log("button clicked");
}, /*capturingPhase=*/ false);

click ,JavaScript ( )。


function process(data) {
	///...
}

{//                !
	let someReallyBigData = { ...
	};

	process(someReallyBigData);
}

$("#my_btn")[0].addEventListener("click", function(evt) {
	console.log("button clicked");
}, /*capturingPhase=*/ false);

someReallyBigData 。

2.let

for let i for , , 。 。


{
	let j;
	for(j=0;j<10;j++){
		let i=j;//        
		console.log(i);
	}
}

3.4.4 const

let,ES6 const, , ( )。 。


const a=2;
a=3;//  !

 

3.5

JavaScript 。 , “ ” , 。

。 , ( {..} )。

ES3 ,try/catch catch 。

ES6 let (var ), 。if(..){let a = 2;} if {..} , 。