JavaScript不支持重載,在JavaScript中,腳本在執行時不會顧及函數定義時的參數,而是直接使用在作用域鏈中最后定義的那個函數。這意味著,相同名稱的函數永遠只存在一個實例
閉包是與作用域相關的一個概念,它指的是內部函數即使在外部函數執行完成并終止后,依然可以訪問其外部函數的屬性。當引用一個變量或方法時,JavaScript會沿著由對象執行路徑構成使用域鏈對使用域進行解析,查找變量最近定義的值,一旦找到即使用該值。function initAnchors(event){
代碼如下:
for (var i=1; i <=3; i++){
var anchor = document.GetElementById('anchor' + i);
anchor.attachEvent('onclick', function() {
alert('my id is anchor' + i);
});
}
}
假設頁面中有三個A元素,ID分別為anchor1到anchor3,程序為三個A元素注冊onclick事件,單擊第個A元素顯示"my id is anchorX",但實際運行情況卻不是這樣,單擊每個A元素都顯示"my id is anchor4"。為什么會這樣呢,因為i的值實際上是在單擊事件發生時才從使用域鏈中取得的,當單擊事件發生時,initAnchors()已執行完畢,此時i的值等于4。解決方法可以按如下
代碼如下:
function registerAnchorListner(anchor,i){
anchor.attachEvent('onclick', function() {
alert('my id is anchor' + i);
}
}
function initAnchors(event){
for (var i=1; i <=3; i++){
var anchor = document.GetElementById('anchor' + i);
registerAnchorListner(anchor,i);
}
}
var anchor = document.GetElementById('anchor' + i);
anchor.attachEvent('onclick', function() {
alert('my id is anchor' + i);
});
迭代對象,在編寫腳本時經常使用到迭代,如下:
代碼如下:
var list = [1,2,3,4];
for(var i = 0;i < list.length; i++){
alert(list);
}
另一種可供選擇的迭代方法是使用for循環遍歷位于(in)list中的每個屬性:
代碼如下:
for(var i in list){
alert(list);
}
此時,得到的是與使用前一迭代方法相同的結果,因為list是一個Array對象。
但是,當使用for(var i in item)方法操縱類似數組而又不是數組的對象時一定要格外小心,如下
代碼如下:
var all=document.getElementsByTagName('*');
for(var i in all){
//對照all元素進行某些操作
}
在這次的迭代過程中,i的值會分別等于length、item和namedItem,而這很可能會導致代碼中出現意外錯誤。在某些情況下,可以使用對象的hasOwnProperty()方法來避免這個問題。如果對象的屬性或方法是非繼承的,那么hasOwnProperty()方法返回true。即這里的檢查不涉及從其它對象繼承的屬性和方法,只會檢查在特定對象自身中直接創建的屬性,比如分配給數組的元素。因此,在如果在for循環中使用這種檢查,那么循環將會跳過length這樣屬性,因為length不是數組all的真系屬性,而是從派生數組all的NameNodeMap對象中繼承的屬性
代碼如下:
var all=document.getElementsByTagName('*');
for(var i in all){
if(!all.hasOwnProperty(i)) continue;
//對照all元素進行某些操作
}
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com