通過var宣告 或未宣告的變數都會在全域性window,this上產生全域性變數。
對於 var a = b = 0;來說,全域性變數a是不能被刪除的,隱式全域性變數b是可以刪除的
對於乙個系統的不同組成部分,如果都有相同命名的全域性變數名,如parta,partb都有乙個全域性變數result,後者會替換前者,顯而易見的,基於第乙個全域性變數的所有運算都會是錯的,這當然不是我們想要的結果。
在es5嚴格模式下,未宣告的變數(如在前面的**片段中的兩個反面教材)工作時會丟擲乙個錯誤。使用命名空間來避免全域性變數
在js,可以在函式的任何位置宣告多個var語句,並且它們就好像是在函式頂部宣告一樣發揮作用,這種行為稱為 hoisting(懸置/置頂解析/預解析)。
globalvar = 'global';
function
testglobalvar()
testglobalvar();
複製**
執行結果:
first undefined
global global
second sofia
global global
複製**
對於globalvar
,生成了兩個變數,乙個是值為global的全域性的globalvar
,還有,作用域在testglobalvar()
函式內的區域性變數globalvar
,我們看到,區域性變數globalvar
一開始並未宣告,所以first的值是undefined,隨後被宣告且附了值,second的時候值變為了sofia。
為了**的可讀性,還是建議規範,宣告統一放在首行,即:
function
testglobalvar()
複製**
for可以迴圈取得陣列或是陣列類似物件的值,譬如arguments和htmlcollection物件,測試迴圈一組陣列,這裡舉例,迴圈頁面上所有的div元素(256個), 幾種迴圈的寫法耗時比較如下:
function
fn1()
} console.timeend('for fn2');
}複製**
執行結果:
for fn2: 17.693115234375ms
複製**
function
fn2()
} console.timeend('for fn2');
}複製**
執行結果:
for fn2: 0.73388671875ms
複製**
function
fn3()
} console.timeend('for fn3');
}複製**
執行結果:
for fn3: 0.177001953125ms
複製**
for-in
迴圈應該用在非陣列物件的遍歷上,使用for-in
進行迴圈也被稱為「列舉」。 建議的是,陣列迴圈用for
,物件迴圈用for-in
;
既然for-in是迴圈的物件的屬性,那麼,我們可以嘗試迴圈遍歷一遍man物件的屬性;
var man = ;
for(var i in man)
複製**
執行結果:
hands 2
legs 2
heads 1
複製**
擴充套件一下,如果,singer物件是繼承別的物件而來或者singer原型鏈上有別的屬性方法,遍歷出來的結果會是怎樣的:codepen.io/sofia92/pen…
function
human()
human.prototype.walk = function () ;
function
singer()
}singer.prototype = new human();
var singer1 = new singer();
console.log('signing1 eyes', singer1.eyes) // "signing1 eyes" 1
singer1.walk(); // "human can walk"
singer1.signing(); // "singer sings well!"
複製**
for(var attr in singer1)
// type : singer
// signing : ƒ ()
// eyes : 1
// hands : 2
// heads : 1
// walk : ƒ ()
console.log('----------------------------');
for(var attr in singer1)
}// type : singer
// signing : ƒ ()
複製**
針對上述結果,我們可以發現,當物件繼承自別的物件時,這個時候遍歷物件屬性會同時擁有父類當屬性與方法,可以通過hasownproperty()
方法過濾出自己的屬性與方法。 深入理解JavaScript箭頭函式
箭頭函式就是個簡寫形式的函式表示式 並且它擁有詞法作用域的this 值 即不會新產生自己作用域下的this,arguments super 和new.target 等物件 此外,箭頭函式總是匿名的 語法 基礎語法 param1,param2,paramn param1,param2,paramn e...
深入理解JavaScript閉包
一 什麼是閉包 多個 兩個或兩個以上 函式巢狀,當內部函式被儲存到外部時,將會生成閉包。內部函式在外面執行的時候一定能夠呼叫的了原來它在的那個函式環境裡的變數。閉包會導致原有作用域鏈不釋放,造成記憶體洩露。functiona var aaa 123 return b var glob 100 var...
javascript對閉包的深入理解
最近看了一些關於閉包的內容,自己總結了一下 function getfunction return result var result1 getfunction for var j 0 j 10 j 每乙個內部函式都會儲存著屬於自己的作用域鏈,而它自己的作用域鏈包括了自己的活動物件,外部函式的活動物...