ES 6に追加されたブロックレベルのスコープlet
12517 ワード
ES 6に追加されたブロックレベルのスコープlet
2015年前に、JavaScriptはブロックレベルの機能領域がないので、その後ES 6バージョンにブロックレベルの作用領域が追加されました.ES 6の新しい特性をよりよく理解するために、まずこのいくつかの問題を提出します.2.なぜブロックレベルのスコープを追加しますか?3.ブロックレベルのスコープはどう使いますか?
ブロックレベルのスコープは何ですか?
ブロックレベルのスコープとは、ステートメントブロックの範囲内でのみ機能することを意味し、この範囲を超えたら無効となり、ステートメントブロックとは、複数のステートメントをペアの大括弧{}の中に入れることを指し、通常はフロー制御に用いられ、例えば
例
なぜブロックレベルのスコープを追加しますか?
ES 6の前に、変数はグローバルスコープ(大域変数ともいう)と関数スコープ(局所変数)だけだったので、以下のような不合理な状況を引き起こします.
1.関数の局所変数は、同じ名前のグローバル変数をカバーします.
例
これは、関数内でグローバル変数を呼び出すと、関数内で宣言されているローカル変数とグローバル変数とは必ずしも同名ではないという結果になります.
2.関数内部では、変数を宣言した後、関数が終了する前に使用できます.
例
これはいくつかの不必要なメモリの消費をもたらします.この二つの不合理な問題を回避するために、ブロックレベルのスコープが出現しました.
ブロックレベルのスコープはどう使いますか?
変数コマンド
例スコープ:変数があるステートメントブロック、つまり、大かっこのペア(); には変数が存在しません.一時的にデッドタイムということです.つまりブロックレベルのスコープから宣言まではこの変数にアクセスできません. 同じブロックの中で、同じ変数名で重複して宣言することはできません. クラシックケース: ES 6のうち、ブロックレベルのスコープは何ですか?運用はどこですか? 変数スコープ
2015年前に、JavaScriptはブロックレベルの機能領域がないので、その後ES 6バージョンにブロックレベルの作用領域が追加されました.ES 6の新しい特性をよりよく理解するために、まずこのいくつかの問題を提出します.2.なぜブロックレベルのスコープを追加しますか?3.ブロックレベルのスコープはどう使いますか?
ブロックレベルのスコープは何ですか?
ブロックレベルのスコープとは、ステートメントブロックの範囲内でのみ機能することを意味し、この範囲を超えたら無効となり、ステートメントブロックとは、複数のステートメントをペアの大括弧{}の中に入れることを指し、通常はフロー制御に用いられ、例えば
if,for,while
など.例
while (x < 10) {
if(x>5){
x++;
}
}
ここ{if(x>5){x++;}}
はステートメントブロックであり、{x++;}
もステートメントブロックであり、巧記:大かっこのペアはステートメントブロックであり、一つのスコープを表している.なぜブロックレベルのスコープを追加しますか?
ES 6の前に、変数はグローバルスコープ(大域変数ともいう)と関数スコープ(局所変数)だけだったので、以下のような不合理な状況を引き起こします.
1.関数の局所変数は、同じ名前のグローバル変数をカバーします.
例
var a = 0
(function() {
console.log(' a:', a) // : a: 0
})()
console.log(' a:', a) // ; a: 0
var a = 0
;(function() {
console.log('a=', a) // :a= undefined, a=0
if (false) {
var a = 1
console.log(a)
}
})()
その理由:変数の昇格により、内層のa変数が外層のa変数をカバーします.これは、関数内でグローバル変数を呼び出すと、関数内で宣言されているローカル変数とグローバル変数とは必ずしも同名ではないという結果になります.
2.関数内部では、変数を宣言した後、関数が終了する前に使用できます.
例
(function() {
console.log(a) // :undefined
if (true) {
for (var a = 0; a < 10; a++) {
var b = 0
console.log(a) // :0~9
}
}
console.log('if a:', a) // :if a: 10
console.log('if b:', b) // :if b: 0
})()
forサイクルで宣言したa,b変数は、関数が終了する前に破壊されません.これはいくつかの不必要なメモリの消費をもたらします.この二つの不合理な問題を回避するために、ブロックレベルのスコープが出現しました.
ブロックレベルのスコープはどう使いますか?
変数コマンド
let
を使用します.例
(function() {
if (true) {
for (let a = 0; a < 10; a++) {
console.log(a) // :0~9
}
}
console.log('if a:', a) // :ReferenceError: a is not defined
})()
let
コマンドの変数:let
コマンドがクローズド機能の代わりにクローズドされた実装:var arr = [];
for(var i = 0; i < 2; i++){
arr[i] = (function(i){
return function(){
console.log(i);
};
}(i));
};
arr[1]();
let実装:'use strict';
var arr = [];
for(let i = 0; i < 2; i++){
arr[i] = function(){
console.log(i);
};
};
arr[1]();
参考記事: