簡単与ました
ました
VAR変数の宣言が持ちます全局作用域
か局部作用域
在全局中声明变量即为全局变量
在函数中声明变量即为局部变量
徐々に明らかにした多くの問題の過程でしばらくヴァール
VARいくつかの主要な問題
可変リフト
宣言変数に使用するvarは変数は、変数を宣言する前に呼び出されることを、変数を持ち上げる問題が発生します
console.log(info);//undefined
var info = 10;
状況の上に表示されますが、実際には非常にある悪い文は、この変数に代わり、未定義のエラーを引用する前に単語の使用が行く必要があるので、。
この問題は、関数の中で特に顕著です
var info = 10;
function fn1(){
console.log(info);//undefined
var info = 20;
}
fn1();
循環の問題点
循環中のvarの問題は非常に深刻です
ここで私は、状況に遭遇しました
//html中有四个span
var oSpan = document.getElementsByTagName('span');
for(var i = 0 ; i < oSpan.length ; i++ ){
oSpan[i].onclick = function(){
console.log(this);//点击出现 你点的那个span
}
}
私たちは、今回がクリックされた時に素子を得ることができることを見出しました
しかし、我々は置くthis
にoSpan[i]
それは時に間違って行くだろう
for(var i = 0 ; i < oSpan.length ; i++ ){
oSpan[i].onclick = function(){
console.log(oSpan[i]);//点击出现 undefined
console.log(i);//点什么都是4
}
}
この時間は、私たちは、iの瞬時値にイベントハンドラ関数を選択していないことがわかります。そして、これが理由のあるもの
私たちは、コードを開くことができます
//拆开for
var i = 0;
oSpan[i].onclick = function(){
console.log(i);
}
var i = 1;
oSpan[i].onclick = function(){
console.log(i);
}
...
var i = 3;
oSpan[i].onclick = function(){
console.log(i);
}
var i = 4;
//在你点击的时候是在页面加载完才调用的函数
上記により、変数varグローバル変数宣言に、変数を受け取る関数が4であることがわかります
溶液は、ブロックレベルのスコープをシミュレートするために、ループ内でクロージャ関数を記述することです
for(var i = 0 ; i < 4 ; i++){
oSpan[i].onclick = function(arg){
return function(){
console.log(arg);//出现 0,1,2,3
}
}(i);
}
しかしES6それは変数を宣言するためのより良い方法を提供してくれます
てみましょう
ES6では、変数は、LETブロックレベルのスコープを宣言されています
手段中間ブロックレベルの範囲は、{}内に効果的に使用することができます
for(let i = 0; i < 4 ; i++){
oSpan[i].onclick = function(){
console.log(i);
}
}
上記の理由は、私の瞬時値を求めることができると私はそれぞれスコープ以下同じ、互いに独立し、機能のいくつかのサイクルです。だから、iの値を持つ各関数呼び出しは、その範囲です。
他のロールをしましょう
何文は、変数の宣言で繰り返されていなかったエラーをできるようになります
let b = 10;
let b = 20;//报错
一時的なデッドゾーンを持つことになりましょう、何の可変リフトにこの質問をさせません
console.log(a);//报错
let a = 20;
プロパティのトップレベルオブジェクト
ブラウザのトップレベルのオブジェクトは、あるwindow
ノード環境では、global
。
プロパティとグローバル変数は、トップ層があるES5 同等に
window.a = 1;
a = 2;
console.log(window.a)//2
トップレベルのオブジェクトに関連付けられているグローバル変数の性質上、それは多くの疑問を持っています
もはや、コンパイル時エラーが宣言されていない変数を求めるメッセージが表示することができ、唯一のノウハウに実行されません
簡単には、無意識のうちにどこにでも読んで、モジュールを助長されていません書き込み、できる属性トップレベルのオブジェクトで、その結果、グローバル変数を作成するには
ウィンドウオブジェクトは、ブラウザのウィンドウオブジェクトを参照して、物理的な意味を持っている、これは不適切です
しかし、変数の宣言はせに属さないトップレベルのオブジェクトのプロパティ
var a = 1;
console.log(this.a);//1
let b = 1;
console.log(this.b);//undefined
CONST
const
一つの方法は、ES6の文です
const
ほとんどの変数宣言は、定数として使用され、読み取り専用モードに定数などの値を変更することはできません
const INFO = 10;
INFO = 20; //报错
const INFO = 20;//报错
ときにconst
時間が宣言されたデータ型への参照値は、参照型スタックに格納されているので、基準値のタイプは、変更することができます。修正操作は、ヒープで行われ、変数が変更されていないアドレスに格納され、データポイントのアドレスが変更されているので、変数の値を宣言CONST修飾されています
const arr = [1,2,3,4];
arr.push(5);
console.log(arr);//[1,2,3,4,5]