JavaScript教程day 11-変数スコープ

2535 ワード

変数のスコープ
JavaScriptにおいて、varで説明された変数は実際に機能領域があります.変数が関数の内部で宣言されている場合、その変数のスコープは関数全体であり、関数の体外では変数を参照することができません.
'use strict';

function foo() {
    var x = 1;
    x = x + 1;
}
グローバルスコープ
どの関数でも定義されていない変数にはグローバルスコープがあります.実際には、JavaScriptは、デフォルトではグローバルオブジェクトwindowがあり、グローバルスコープの変数は実際にwindowの属性に結び付けられているので、直接にグローバル変数courseにアクセスすることとアクセスwindwo.courseにアクセスすることは全く同じである.
'use strict';

var course = "Learn Javascript";
alert(course); // ‘Learn JavaScript’
alert(window.course); // 'Learn JavaScript'
関数定義には2つの方法があるので、変数方式var foo = function() {}で定義された関数も実際には大域変数であるので、上位関数の定義も大域変数と見なされ、windwoオブジェクトに紐付けられる.
'use strict';

function foo() {
    alert('foo');
}
foo(); //     foo  
window.foo(); //   window.foo()  
私たちが毎回呼び出したalert()関数は、実はwindowの変数です.
'use strict';

window.alert('  window.alert()');
//  alert        
var old_alert = window.alert();
//  alert      :
window.alert = function () {}
alert('   alert()   !');
//   alert
window.alert = old_alert;
alert('    alert() !');
名前空間:
大域変数はwindwoに結合され、異なるJavaScriptファイルが同じグローバル変数を使用している場合、または同じ名前のトップ関数を定義している場合、ネーミング衝突を引き起こし、発見されにくい.衝突を減らす方法の一つは、自分のすべての変数と関数を一つの大域変数に結びつけることです.自分のコードをすべて一意の名前空間MYAPPに置くと、グローバル変数衝突の可能性が大幅に減少します.
//        MYAPP
var MYAPP = {};
//     :
MYAPP.name = 'myapp';
MYAPP.version = 1.0;

//     
MYAPP.foo = function () {
    return 'foo';
}
JavaScriptの変数スコープは、実際には関数内部であるため、forループなどのステートメントブロックでは、ローカルスコープを持つ変数を定義することができません.
'use strict';

function foo() {
    for (var i = 0; i < 100; i++) {
        //
    }
    i += 100; //         i
}
ブロックレベル作用領域を解決するために、ES 6は新しいキーワードletを導入し、letの代わりにvarを使用して、ブロックレベル作用領域変数を説明することができる.
'use strict';

function foo() {
    var sum = 0;
    for (let i = 0; i<100; i++) {
        sum += i;
    }
    i += 1; // SyntaxError
}
定数:varletによって説明されたのは定数ですので、もし一つの定数を説明するなら、ES 6の前ではだめです.私たちは通常、すべての大きな変数で名来に表示します.これは定数です.彼の値を変更しないでください.
'use strict';

var PI = 3.14;
// ES6          ,const     ,const let        :
const PI = 3.14;
PI = 3; //         ,     
PI; // 3.14
メモは廖雪峰JavaScript教程から整理します.