日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JavaScript容易犯错的九个陷阱

發(fā)布時間:2025/7/25 javascript 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaScript容易犯错的九个陷阱 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

以下是JavaScript容易犯錯的九個陷阱。雖然不是什么很高深的技術問題,但注意一下,會使您的編程輕松些,即所謂make life easier. 以及對某些陷阱會混雜一些評點。
  1. 最后一個逗號

  如這段代碼,注意最后一個逗號,按語言學角度來說應該是不錯的(python的類似數(shù)據(jù)類型辭典dictionary就允許如此)。IE會報語法錯誤,但語焉不詳,你只能用人眼從幾千行代碼中掃描。

以下是引用片段:

Code
  var?theObj?=?{?
  city?:?
"Boston",?
  state?:?
"MA",?
  }
?

?

?

  2. this的引用會改變

  如這段代碼:

以下是引用片段:
  <input type="button" value="Gotcha!" id="MyButton" >
 ?????

Code
1var?MyObject?=?function?()?{?
2  this.alertMessage?=?"Javascript?rules";?
3  this.ClickHandler?=?function()?{?
4  alert(this.alertMessage?);?
5  }
?
6  }
();?
7  document.getElementById(”theText”).onclick?=??MyObject.ClickHandler?
8

?

?

  并不如你所愿,答案并不是”JavaScript rules”。在執(zhí)行MyObject.ClickHandler時,代碼中紅色這行,this的引用實際上指向的是document.getElementById("theText")的引用。可以這么解決:

以下是引用片段:
  <input type="button" value="Gotcha!" id="theText" >
  

Code
1var?MyObject?=?function?()?{?
2  var?self?=?this;?
3  this.alertMessage?=?“Javascript?rules”;?
4  this.OnClick?=?function()?{?
5  alert(self.value);?
6  }
?
7  }
();?
8  document.getElementById(”theText”).onclick?=??MyObject.OnClick?
9


  實質(zhì)上,這就是JavaScript作用域的問題。如果你看過,你會發(fā)現(xiàn)解決方案不止一種。

  3. 標識盜賊

  在JavaScript中不要使用跟HTML的id一樣的變量名。如下代碼:

以下是引用片段:
  <input type="button" id="TheButton">
  <script>
  TheButton = get("TheButton");
  </script>


  IE會報對象未定義的錯誤。

  4. 字符串只替換第一個匹配

  如下代碼:

以下是引用片段:
  <script>
  var fileName = "This is a title".replace(" ","_");
  </script>


  而實際上,結(jié)果是”This_is a title“. 在JavaScript中,String.replace的第一個參數(shù)應該是正則表達式。所以,正確的做法是這樣:

以下是引用片段:
  var fileName = "This is a title".replace(/ /g,"_");


 ? 5. mouseout意味著mousein

  事實上,這是由于事件冒泡導致的。IE中有mouseenter和mouseleave,但不是標準的。在此建議大家使用庫比如YUI來解決問題。

  6. parseInt是基于進制體系的

  這個是常識,可是很多人給忽略了parseInt還有第二個參數(shù),用以指明進制。比如,parseInt("09"),如果你認為答案是9,那就錯了。因為,在此,字符串以0開頭,parseInt以八進制來處理它,在八進制中,09是非法,返回false,布爾值false轉(zhuǎn)化成數(shù)值就是0. 因此,正確的做法是parseInt("09", 10).

  7. for...in...會遍歷所有的東西

  有一段這樣的代碼:

以下是引用片段:

Code
var?arr?=?[5,10,15]?
  
var?total?=?1;?
  
for?(?var?x?in?arr)?{?
  total?
=?total?*?arr[x];?
  }?

  運行得好好的,不是嗎?但是有一天它不干了,返回的值變成了NaN,。只不過引入了一個庫而已。原來是這個庫改寫了Array的prototype,這樣,我們的arr平白無過多出了一個屬性(方法),而for...in...會把它給遍歷出來。所以這樣做才是比較安全的:

以下是引用片段:
  

Code
for?(?var?x?=?0;?x?<?arr.length;?x++)?{?
  total?
=?total?*?arr[x];?
  }?

?


  其實,這也是污染基本類的prototype會帶來危害的一個例證。

  8. 事件處理器的陷阱

  這其實只會存在使用作為對象屬性的事件處理器才會存在的問題。比如window.onclick = MyOnClickMethod這樣的代碼,這會復寫掉之前的window.onclick事件,還可能導致IE的內(nèi)容泄露(sucks again)。在IE還沒有支持DOM 2的事件注冊之前,建議使用庫來解決問題,比如使用YUI:

以下是引用片段:
  YAHOO.util.Event.addListener(window, "click", MyOnClickMethod);


  這應該也屬于常識問題,但新手可能容易犯錯。

  9. Focus Pocus

  新建一個input文本元素,然后把焦點挪到它上面,按理說,這樣的代碼應該很自然:

以下是引用片段:
  var newInput = document.createElement("input");
  document.body.appendChild(newInput);
  newInput.focus();
  newInput.select();

  但是IE會報錯(sucks again and again)。理由可能是當你執(zhí)行fouce()的時候,元素尚未可用。因此,我們可以延遲執(zhí)行:

以下是引用片段: 

Code
var?newInput?=?document.createElement("input");?
  newInput.id?
=?"TheNewInput";?
  document.body.appendChild(newInput);?
  setTimeout(
function(){?//?
  document.getElementById('TheNewInput').focus();?
  document.getElementById(
'TheNewInput').select();},?10);?

?

  在實踐中,JavaScript的陷阱還有很多很多,大多是由于解析器的實現(xiàn)不到位而引起。

轉(zhuǎn)自網(wǎng)上

轉(zhuǎn)載于:https://www.cnblogs.com/rayking/archive/2008/09/16/1291532.html

總結(jié)

以上是生活随笔為你收集整理的JavaScript容易犯错的九个陷阱的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。