JavaScript教程day 11-変数スコープ
2535 ワード
変数のスコープ
JavaScriptにおいて、
どの関数でも定義されていない変数にはグローバルスコープがあります.実際には、JavaScriptは、デフォルトではグローバルオブジェクト
大域変数は
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
}
定数:var
とlet
によって説明されたのは定数ですので、もし一つの定数を説明するなら、ES 6の前ではだめです.私たちは通常、すべての大きな変数で名来に表示します.これは定数です.彼の値を変更しないでください.'use strict';
var PI = 3.14;
// ES6 ,const ,const let :
const PI = 3.14;
PI = 3; // ,
PI; // 3.14
メモは廖雪峰JavaScript教程から整理します.