精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

10個JavaScript常見BUG及修復方法

新聞 前端
如今網站幾乎100%使用JavaScript。JavaScript看上去是一門十分簡單的語言,然而事實并不如此。它有很多容易被弄錯的細節,一不注意就導致BUG。

譯者按:JavaScript語言設計太靈活,用起來不免要多加小心掉進坑里面。

原文: Top 10 bugs and their bug fixing

譯者: Fundebug

為了保證可讀性,本文采用意譯而非直譯。另外,本文版權歸原作者所有,翻譯僅用于學習。

如今網站幾乎100%使用JavaScript。JavaScript看上去是一門十分簡單的語言,然而事實并不如此。它有很多容易被弄錯的細節,一不注意就導致BUG。

1. 錯誤的對this進行引用

在閉包或則回調中, this 關鍵字的作用域很容易弄錯。舉個例子:

Game.prototype.restart = function () {
  this.clearLocalStorage();
  this.timer = setTimeout(function() {
    this.clearBoard();    // 此處this指的是?
  }, 0);
};

如果執行上面的代碼,我們會看到報錯:

Uncaught TypeError: undefined is not a function

出錯的原因在于:當你調用 setTimeout 函數,你實際上調用的是 window.setTimeout() 。在 setTimeout 中傳入的匿名函數是在 window 這個對象環境下,所以 this 是指向 window ,但是 window 并沒有 clearBoard 方法。

如何解決呢?定義新的變量引用指向 Game 對象的 this ,然后就可以使用啦。

Game.prototype.restart = function () {
  this.clearLocalStorage();
  var self = this;   // 將this指向的對象綁定到self
  this.timer = setTimeout(function(){
    self.clearBoard();
  }, 0);
};

或則使用 bind() 函數:

Game.prototype.restart = function () {
  this.clearLocalStorage();
  this.timer = setTimeout(this.reset.bind(this), 0);  // bind to 'this'
};

Game.prototype.reset = function(){
    this.clearBoard();    // 此處this的引用正確
};

2. 和塊作用域(block scope)有關的BUG

在大多數程序語言中,每一個函數塊都有一個獨立的新的作用域,但是在JavaScript中并不是。例如:

for (var i = 0; i < 10; i++) {
  /* ... */
}
console.log(i);  // 會輸出什么呢?

通常在這種情況下,調用 console.log() 會輸出 undefined 或則報錯。不過呢,這里會輸出 10 。在JavaScript中,即使for循環已經結束,變量 i 依然存在,并且記錄最后的值。有些開發者會忘記這一點,然后導致許多bug。我們可以使用 let 而不是 for 來杜絕這一問題。

3. 內存泄漏

你需要監控內存使用量,因為泄露很難避免。內存泄露可能由于引用不存在的對象或則循環引用導致。

  • 如何避免:關注對象的可訪問性(reachability)。
  • 可訪問的對象:

    • 現有的call stack任何位置可以訪問的對象
    • 全局對象

當一個對象可以通過引用訪問到,那么會在內存中保存。瀏覽器的垃圾回收器僅僅會把那些不可訪問的對象回收。

4. 混淆的相等判斷

JavaScript自動將所有在布爾環境下的變量類型轉換為布爾類型,但是可能導致bug。舉例:

// 所有都是true
console.log(false == '0');
console.log(null == undefined);
console.log(" \t\r\n" == 0);
console.log('' == 0);

// 注意:下面兩個也是
if ({}) // …
if ([]) // …

{} 和 [] 都是對象,他們都會被轉換為true。為了防止bug出現,推薦使用 === 和 !== 來做比較,因為不會隱式做類型轉換。

5. 低效的DOM操作

在JavaScript中,你可以輕松操作DOM(添加、修改和刪除),但是開發者往往很低效地去操作。這會導致bug出現,因為這些操作非常耗費計算資源。為了解決這個問題,推薦使用文檔碎片(Document Fragment),如果你需要操作多個DOM元素。

廣告: 你的線上代碼真的沒有BUG嗎?歡迎免費使用 Fundebug !我們可以幫助您第一時間發現BUG!

6. 在for循環中錯誤的定義函數

舉例:

var elements = document.getElementsByTagName('input');
var n = elements.length;    // 假設我們有10個元素
for (var i = 0; i < n; i++) {
    elements[i].onclick = function() {
        console.log("元素編號#" + i);
    };
}

如果我們有10個元素,那么點擊任何一個元素都會顯示“元素編號#10”!因為在 onclick 被調用的時候,for循環已經結束,因此所有的i都是10。

解法:

var elements = document.getElementsByTagName('input');
var n = elements.length;    // 假設有10個元素
var makeHandler = function(num) {  // outer function
     return function() {   // inner function
         console.log("元素編號##" + num);
     };
};
for (var i = 0; i < n; i++) {
    elements[i].onclick = makeHandler(i+1);
}

makeHandler 在for循環執行的時候立即被調用,獲取到當前的值 i+1 ,并且存儲在變量 num中。 makeHandler 返回一個函數使用 num 變量,該函數被綁定到元素的點擊事件。

7. 通過原型錯誤地繼承

開發者如果沒能正確理解繼承的原理,那么就可能寫出有bug的代碼:

BaseObject = function(name) {
    if(typeof name !== "undefined") {
        this.name = name;
    } else {
        this.name = 'default'
    }
};
var firstObj = new BaseObject();
var secondObj = new BaseObject('unique');

console.log(firstObj.name);  // -> 輸出'default'
console.log(secondObj.name); // -> 輸出'unique'

但是,如果我們做如下操作:

delete secondObj.name;

那么:

console.log(secondObj.name); // -> 輸出'undefined'

而我們實際上想要的結果是打印默認的name。

BaseObject = function (name) {
    if(typeof name !== "undefined") {
        this.name = name;
    }
};

BaseObject.prototype.name = 'default';

每一個 BaseObject 都繼承 name 屬性,并且默認值為 default 。此時如果 secondObj 的 name 屬性被刪除掉,通過原型鏈查找會返回正確的默認值。

var thirdObj = new BaseObject('unique');
console.log(thirdObj.name);  // -> 輸出'unique'

delete thirdObj.name;
console.log(thirdObj.name);  // -> 輸出'default'

8. 實例方法中的無效引用

我們來實現一個簡單的構造函數用來創建對象:

var MyObject = function() {}

MyObject.prototype.whoAmI = function() {
    console.log(this === window ? "window" : "MyObj");
};

var obj = new MyObject();

為了使用方便,我們定義變量 whoAmI 來引用 obj.whoAmI :

var whoAmI = obj.whoAmI;

打印出來看看:

console.log(whoAmI);

控制臺會輸出:

function () {
    console.log(this === window ? "window" : "MyObj");
}

現在我們來對比一下兩者調用的區別:

obj.whoAmI();  // 輸出"MyObj" (和期望一致)
whoAmI();      // 輸出"window" (竟然輸出了window)

當我們把 obj.whoAmI 賦值給 whoAmI 的時候,這個新的變量 whoAmI 是定義在全局下,因此 this 指向全局的 window ,而不是 MyObj 。如果我們真的要獲取對 MyObj 的函數的引用,需要在其作用域下。

var MyObject = function() {}

MyObject.prototype.whoAmI = function() {
    console.log(this === window ? "window" : "MyObj");
};

var obj = new MyObject();
obj.w = obj.whoAmI;   // 任然在obj的作用域

obj.whoAmI();  // 輸出"MyObj"
obj.w();       // 輸出"MyObj"

9. setTimeout/setInterval函數第一個參數誤用字符串

如果你將一個字符串作為setTimeout/setTimeInterval,它會被傳給函數構造函數并構建一個新的函數。該操作流程很慢而且低效,并導致bug出現。

var hello = function(){
  console.log("hello, fundebug !");
}
setTimeout("hello", 1000);

一個好的替代方法就是傳入函數作為參數:

setInterval(logTime, 1000);   // 將logTime函數傳入

setTimeout(function() {       // 傳入一個匿名函數
    logMessage(msgValue);     
  }, 1000);

10. 未能成功使用strict mode

使用strict model會增加很多限制條件來加強安全和防止某些錯誤的出現,如果不使用 strict mode ,你就相當于少了一個得力的助手幫你避免錯誤:

  • 更加容易debug
  • 避免不小心定義了不該定義的全局變量
  • 避免this隱式轉換
  • 避免屬性名字或則參數值的重復使用
  • eval()更加安全
  • 無效地使用delete會自動拋出錯誤   

版權聲明:

轉載時請注明作者Fundebug以及本文地址:

https://blog.fundebug.com/2017/11/15/top_10_bugs_and_fixing_method/

 

責任編輯:張燕妮 來源: SegmentFault
相關推薦

2024-12-06 11:42:33

2018-06-27 10:07:28

2013-07-23 06:03:01

Android開發BuAmdroid開發學習Android開發Bu

2024-07-16 08:00:00

Kubernetes開發

2020-10-14 10:41:24

安全漏洞數據

2018-11-15 11:00:27

Python漏洞修復

2010-06-17 09:39:07

Ubuntu Grub

2010-06-13 12:59:15

Ubuntu xp G

2010-06-12 11:26:21

Grub Rescue

2022-01-14 23:42:30

Windows 10Windows微軟

2025-10-14 07:35:26

Kubernetes部署YAML

2011-01-24 13:36:11

網絡故障修復

2019-11-01 15:33:00

JavaScript面試開發

2021-07-16 23:13:10

Windows 10Windows微軟

2018-02-02 08:35:12

Windows 10原始版升級

2009-04-27 23:45:07

2023-06-16 15:17:21

sprint工具

2022-02-09 08:21:43

累積更新微軟Windows 10

2014-12-17 09:40:22

dockerLinuxPaaS

2010-10-13 11:19:11

MySQL數據文件
點贊
收藏

51CTO技術棧公眾號

国产精品人人人人| 岛国av免费观看| 欧美精品日韩少妇| 国产大陆精品国产| 69视频在线免费观看| 中国毛片在线观看| 97色婷婷成人综合在线观看| 亚洲乱码精品一二三四区日韩在线| 99中文视频在线| 在线观看 亚洲| 91精品电影| 日韩成人av网址| 中文字幕66页| 人人草在线视频| 综合久久久久久| 精品无人乱码一区二区三区的优势| 无码人妻精品一区二| 香蕉久久网站| 亚洲欧美激情视频| 青青草原播放器| 欧美大片免费观看网址| 亚洲一区二三区| 特级西西444www大精品视频| 亚洲国产福利视频| 美女任你摸久久| 91po在线观看91精品国产性色| 国产欧美小视频| 欧美在线导航| 日韩一级黄色片| 91小视频网站| 黑人巨大精品| 亚洲va中文字幕| 99热都是精品| 91官网在线| 99精品国产一区二区三区不卡| 国产精品一二区| 天堂网中文字幕| 亚洲第一黄网| 欧美日韩国产999| 毛片视频免费播放| 精品国产乱码久久久久久果冻传媒| 亚洲国产97在线精品一区| 欧美性猛交乱大交| 国外成人福利视频| 欧美一a一片一级一片| 一区二区在线观| 五月天婷婷在线视频| 久久久91精品国产一区二区三区| 精品久久蜜桃| 日本国产在线观看| 粉嫩av一区二区三区在线播放| 成人性教育视频在线观看| 伊人久久国产精品| 麻豆精品一区二区三区| 国产精品欧美风情| 欧美性受xxx黑人xyx性爽| 石原莉奈在线亚洲三区| 欧美做爰性生交视频| 国产日产精品一区二区三区| 99国产精品视频免费观看一公开 | 精品久久久久久国产| 六月婷婷激情综合| 丁香花在线影院| 亚洲成人久久影院| 欧美日韩黄色一级片| 亚洲人成在线网站| 欧美视频免费在线观看| 欧美视频第一区| 性欧美hd调教| 欧美日韩一区二区在线视频| 九九热精品在线播放| 亚洲欧美综合久久久久久v动漫| 欧美日韩成人在线一区| 日本特黄在线观看| avtt综合网| 日韩精品极品毛片系列视频| 久久精品成人av| 日本不卡二三区| 免费av一区二区| 国产精品成人免费一区二区视频| 夜夜嗨一区二区三区| 国产91九色视频| 亚洲一区在线观| 国产成人亚洲综合色影视| 国产麻豆日韩| 高清性色生活片在线观看| 国产精品国产馆在线真实露脸 | 97视频热人人精品| 天堂中文在线看| 国产亚洲午夜高清国产拍精品| 神马影院我不卡| 永久免费网站在线| 天天影视涩香欲综合网| 天天操天天摸天天爽| 国产精品一区免费在线| 欧美精品一区二区三区久久久| 欧美色图亚洲激情| 亚洲香蕉av| 555www成人网| 国产精品毛片一区二区在线看舒淇| 丁香桃色午夜亚洲一区二区三区| 欧美一进一出视频| 羞羞网站在线看| 91国产免费看| 永久免费未满蜜桃| 欧美激情偷拍自拍| 91av网站在线播放| 国产精品国产av| 91美女片黄在线观看91美女| 免费看av软件| 奇米777日韩| 日韩精品一区二区三区四区| 久久精品国产亚洲av久| 国模吧视频一区| 国产精品自拍偷拍视频| 婷婷丁香一区二区三区| 一区在线播放视频| 成年人观看网站| 香蕉大人久久国产成人av| 亚洲天堂网在线观看| 18精品爽视频在线观看| 黄色小说综合网站| 欧美激情论坛| 岛国毛片av在线| 91精品国产一区二区| 国产aⅴ激情无码久久久无码| 欧美一区久久| 国产精品自拍偷拍| 国产区视频在线| 精品美女久久久久久免费| 中文字幕在线视频一区二区三区| 亚洲三级精品| 午夜精品在线视频| 午夜久久久久久噜噜噜噜| 国产精品不卡视频| 男操女免费网站| 蜜桃一区二区三区| 97精品久久久| 国产综合无码一区二区色蜜蜜| 亚洲色图19p| 日本肉体xxxx裸体xxx免费| 亚洲成人一品| 91精品国产高清久久久久久久久 | 日韩欧美中文字幕视频| 美女精品一区二区| 日韩欧美在线电影| 性欧美超级视频| 亚洲欧美另类人妖| 久久久久女人精品毛片九一| 不卡一区二区三区四区| www.欧美黄色| 亚洲性视频在线| 久久99久久99精品中文字幕 | 永久久久久久久| 久久超碰97人人做人人爱| 亚洲第一在线综合在线| 成人开心激情| 伊人伊成久久人综合网小说| 欧美精品一二三四区| 国产人妖乱国产精品人妖| 黄色av免费在线播放| 欧美色女视频| 国产精品自拍网| 黄av在线免费观看| 5858s免费视频成人| 欧美一级片在线视频| 国产曰批免费观看久久久| 久久久久亚洲av无码专区喷水| 高清一区二区三区av| 欧美黄色三级网站| 婷婷色在线观看| 欧美性生活大片免费观看网址 | 国产精品超碰97尤物18| 在线免费观看av网| 91精品一区国产高清在线gif| 91亚洲va在线va天堂va国| 50度灰在线| 亚洲精品在线一区二区| 黄色在线视频网址| 国产精品嫩草影院av蜜臀| 肉色超薄丝袜脚交| 欧美日韩成人| 九九99玖玖| 亚洲精品一级二级| 久久久国产一区二区三区| 性做久久久久久久久久| 欧美日韩亚洲一区二| jizz日本在线播放| 国产成人av电影在线| 国产91在线免费| 日韩在线第七页| av成人观看| 日韩电影免费观看高清完整版| 亚洲偷欧美偷国内偷| 国产精品一级视频| 黄色精品一区二区| 日本伦理一区二区三区| 大美女一区二区三区| 美女喷白浆视频| 欧美区亚洲区| 欧美乱偷一区二区三区在线| 亚洲精品伊人| 欧美中文在线免费| 成人在线免费看片| 国产亚洲xxx| www.黄色片| 欧美日韩一二三区| 福利一区二区三区四区| 国产欧美久久久精品影院| 欧美一级片在线免费观看| 久热国产精品| 日韩精品在线观看av| 欧美在线色图| 韩国一区二区三区美女美女秀| 伦一区二区三区中文字幕v亚洲| 欧美激情视频一区二区| 1769在线观看| 精品无人区乱码1区2区3区在线| 国产伦理一区二区| 色噜噜夜夜夜综合网| 国产精品18p| 亚洲精品视频在线看| 免费一级黄色录像| av成人老司机| 95视频在线观看| 国精产品一区一区三区mba视频| 日本三级免费网站| 伊人成年综合电影网| 精品日韩在线播放| 99久久夜色精品国产亚洲96 | 亚洲超丰满肉感bbw| 三上悠亚在线观看视频| 欧美激情一区二区三区不卡| 人妻无码中文久久久久专区| 国产a级毛片一区| 波多野结衣在线免费观看| 麻豆免费精品视频| 奇米影视四色在线| 日韩精品五月天| 国产一区亚洲二区三区| 亚洲成色精品| 欧美无砖专区免费| 亚洲高清二区| 免费看黄在线看| 国内精品久久久久久久影视蜜臀| 中文字幕一区二区三区有限公司 | 午夜久久久久久久久久久| 日韩系列欧美系列| 亚洲综合欧美日韩| 久久影院一区| 亚洲一区影院| 午夜影院欧美| a级黄色片网站| 中文精品久久| 精品国产一区二区三区无码| 影音先锋在线一区| 日韩小视频网站| 亚洲九九精品| 色综合久久久久无码专区| 一本久道综合久久精品| 男人添女人下面高潮视频| 一区二区日韩免费看| 日韩av片在线看| 日韩不卡一区二区三区| 国产又猛又黄的视频| 麻豆精品一区二区综合av| 欧美性受xxxx黒人xyx性爽| 国产一区二区精品久久| 超级砰砰砰97免费观看最新一期| 国产东北露脸精品视频| 日韩女优在线视频| 久久久久久免费| 9.1片黄在线观看| 国产精品久久久久久久久久久免费看| 国产又粗又长免费视频| 亚洲精品一卡二卡| 日韩av在线播| 色婷婷精品久久二区二区蜜臀av| 欧美高清69hd| 日韩精品一区二区在线观看| 日韩av成人| 中文字幕在线亚洲| 免费影视亚洲| 清纯唯美亚洲综合| 婷婷丁香久久| 黑人中文字幕一区二区三区| 国内精品久久久久久99蜜桃| 在线视频不卡一区二区三区| 欧美视频二区| 成人精品视频一区二区| 国产综合成人久久大片91| 亚洲av人人澡人人爽人人夜夜| 久久午夜国产精品| 午夜精品福利在线视频| 欧美日韩国产精品一区二区不卡中文| 69xxxx国产| 日韩三级.com| 欧美日本网站| 免费99精品国产自在在线| 中文在线免费视频| 亚洲a成v人在线观看| 日韩精品免费一区二区三区竹菊| 亚洲精品一区二区三区蜜桃久| 欧美精品黄色| 国产精品无码av无码| 国产精品1区2区3区在线观看| 成人片黄网站色大片免费毛片| 亚洲同性同志一二三专区| 秋霞精品一区二区三区| 日韩精品一区二区三区在线| 在线日本视频| 欧美亚洲国产日本| 伊人久久大香线蕉av超碰| 午夜精品亚洲一区二区三区嫩草| 亚洲大片av| 无码国产精品一区二区高潮| 欧美极品美女视频| 国产成人综合欧美精品久久| 欧美变态凌虐bdsm| 欧美日韩欧美| 国产精品久久999| 欧美挤奶吃奶水xxxxx| 一二三在线视频| 麻豆免费精品视频| 蜜桃传媒一区二区亚洲| 五月婷婷综合网| 成人午夜福利视频| 久久精品视频在线观看| 国产一区二区三区四区五区3d | 欧美高清视频手机在在线| 色欲av无码一区二区人妻| 懂色av一区二区在线播放| 丝袜美腿小色网| 欧美日韩一区精品| yiren22亚洲综合伊人22| 国产69久久精品成人| 老牛国内精品亚洲成av人片| 免费日韩在线观看| 国内精品免费**视频| 日韩精品一区二区三区在线视频| 欧美日韩一级大片网址| 高清在线观看av| 国产精品高清在线观看| 国产成人精品999在线观看| 免费观看精品视频| 91年精品国产| 国产91精品一区| 日韩精品在线免费观看视频| 美女91在线看| 久久精品人人做人人爽电影| 一区二区三区导航| 97人妻精品一区二区三区免| 婷婷综合另类小说色区| 天天综合永久入口| 91a在线视频| 九九精品在线| www.超碰com| 国产精品萝li| 91亚洲欧美激情| 久久电影一区二区| 亚洲三区欧美一区国产二区| 精品无码一区二区三区爱欲| av综合在线播放| 天天干,天天干| 色偷偷91综合久久噜噜| 国产精品中文| 精品无码国产一区二区三区av| av不卡在线观看| 91丨九色丨海角社区| 日韩亚洲精品电影| 国产精品亚洲一区二区在线观看 | 国产精品日韩高清| 日韩午夜av| 手机免费看av| 在线不卡中文字幕| 日本无删减在线| 久久riav| 欧美bbbbb| 色在线观看视频| 日韩hd视频在线观看| 中文字幕日本一区二区| 无颜之月在线看| 91在线精品一区二区| 中文字幕一区二区在线视频| 乱亲女秽乱长久久久| 欧美顶级毛片在线播放| 人人干人人干人人| 亚洲一级二级三级在线免费观看| 色中色在线视频| 91精品一区二区| 99国产一区| 欧美a级片免费看| 亚洲的天堂在线中文字幕| 久久精品女人天堂av免费观看| 一区二区三区三区在线| 99视频有精品| 国产剧情精品在线| 国产成人av在线播放| 欧美极品一区二区三区| 欧美图片第一页|