JavaScriptはメモの役割領域(三)-関数スコープとブロックの役割領域を勉強します.
関数のスコープとは、この関数に属するすべての変数が、関数全体の範囲で使用され、多重化されるという意味です.
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 )
:
- , 。
- , arguments.callee , , 。
- / 。
:
, 。
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 {..} , 。
・