jsブロックレベルのスコープ--理解
2079 ワード
JavaScriptにはブロックレベルのスコープの概念がない.これは、ブロックレベルのステートメントで定義された変数が、実際には、ステートメントで作成されたものではなく、関数に含まれていることを意味します.
javaScriptでは、変数iはtestdemo()の手紙の対象になりますので、その(i)定義の始まりから、このブロック関数に含まれています.関数内部でランダムにアクセスできます.再定義しても、その値は変わりません.
まとめ:javaScriptは何度も変数を宣言したかどうかは教えません.この場合、後者の宣言の変数は無視されます.ただし、後者の宣言は変数の初期化を行います.
解決:匿名関数の声明でこの問題を回避できます.
ブロックレベルのスコープで以下のように宣言されています.文法は以下の通りです.
上の例は以下の通りです.
理由:javascriptは関数宣言の開始として機能していますが、関数宣言の後に括弧が付いていません.しかし、関数の表現数の後には、括弧が付いていますので、関数宣言を関数式にする方法は、関数宣言にペアの括弧を付けることです.
(function(){}これは自分で実行できる匿名関数表現を形成しています.中はそのブロックレベルの作用領域、すなわちプライベートロール領域です.
用途:臨時変数が必要な場合、ブロックレベルのスコープは彼の役割を果たします.ブロックレベルのスコープを作成することによって、他の人が定義したグローバル変数を混乱させないか心配しないで、自分の考えに基づいて自分の変数を定義できます.たとえば:
function testdemo(){
for(var i=0;i<10;i++){
}
alert(i);
}
testdemo();
最後の出力は:10です.javaScriptでは、変数iはtestdemo()の手紙の対象になりますので、その(i)定義の始まりから、このブロック関数に含まれています.関数内部でランダムにアクセスできます.再定義しても、その値は変わりません.
function testdemo(){
for(var i=0;i<10;i++){
}
var i;
alert(i);
}
testdemo();
この時出力するiはまだ10です.まとめ:javaScriptは何度も変数を宣言したかどうかは教えません.この場合、後者の宣言の変数は無視されます.ただし、後者の宣言は変数の初期化を行います.
解決:匿名関数の声明でこの問題を回避できます.
ブロックレベルのスコープで以下のように宣言されています.文法は以下の通りです.
function testdemo(){
(function(){
for(var i=0;i<10;i++){
}
})();
alert(i);
}
testdemo();
この時は間違えます.iは定義がないからです.上の例は以下の通りです.
function testdemo(){
var testfunction = function(){
//
for(var i=0;i<10;i++){
}
};
testfunction();
alert(i);
}
testdemo();
注意:下記の書き方はエラーとなります. function(){
for(var i=0;i<10;i++){
}
}();//erro
:
function testdemo(){
var testfunction = function(){
for(var i=0;i<10;i++){
}
}();
alert(i);
}
testdemo();
:
function testdemo(){
var testfunction = function(){
for(var i=0;i<10;i++){
}
};
testdemo();
alert(i);
}
testdemo();
まとめ:上のコードの最初の書き方はなぜ間違えましたか?理由:javascriptは関数宣言の開始として機能していますが、関数宣言の後に括弧が付いていません.しかし、関数の表現数の後には、括弧が付いていますので、関数宣言を関数式にする方法は、関数宣言にペアの括弧を付けることです.
(function(){}これは自分で実行できる匿名関数表現を形成しています.中はそのブロックレベルの作用領域、すなわちプライベートロール領域です.
用途:臨時変数が必要な場合、ブロックレベルのスコープは彼の役割を果たします.ブロックレベルのスコープを作成することによって、他の人が定義したグローバル変数を混乱させないか心配しないで、自分の考えに基づいて自分の変数を定義できます.たとえば:
(function(){
var now = new Date();
if(now.getMonth()==0 && now.getDate()==1){
alert("love you");
}
})();
この小さいコードをグローバルスコープに入れて、いつが1月1日なのか確認できます.この日になったらメッセージを提示します.ここでnow変数はブロックレベルのスコープ内に定義されており、匿名関数の局所変数である他の局所変数に影響を及ぼす心配はない.