JavaScript中常見陷阱小結

來源:互聯網
上載者:User

你所建立的所有函數都是區分大小寫
單引號('字串')和雙引號("字串")在JavaScript中沒有特殊的區別,都可以用來建立字串.但作為一般原則,大多數WEB開發人員都選擇使用單引號 而不是雙引號,因為XHTML規範要求所有XHTML 屬性值都必須使用雙引號括起來.

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元素進行某些操作
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.