亚洲av午夜福利精品一区人妖,亚洲乱码日产精品a级毛片久久,91精品视频观看,青草青草久热精品视频在线观看

10種最常見的Javascript錯誤

2018-5-17    周周

以下是 JavaScript 錯誤 Top 10:

  3a8ccf12-f663-38d7-bca8-6178415d9875.png

       為了便于閱讀,我們將每個錯誤描述都縮短了。接下來,讓我們深入到每一個錯誤,來確定什么會導(dǎo)致它,以及如何避免創(chuàng)建它。 
1. Uncaught TypeError: Cannot read property 
        如果你是一個 JavaScript 開發(fā)人員,可能你看到這個錯誤的次數(shù)比你敢承認(rèn)的要多(LOL…)。當(dāng)你讀取一個未定義的對象的屬性或調(diào)用其方法時,這個錯誤會在 Chrome 中出現(xiàn)。 您可以很容易的在 Chrome 開發(fā)者控制臺中進(jìn)行測試(嘗試)。

       發(fā)生這種情況的原因很多,但常見的一種是在渲染 UI 組件時對于狀態(tài)的初始化操作不當(dāng)。
        我們來看一個在真實(shí)應(yīng)用程序中發(fā)生的例子:我們選擇 React,但該情況也同樣適用于 Angular、Vue 或任何其他框架。

Javascript代碼  

class Quiz extends Component {
  componentWillMount() {
    axios.get('/thedata').then(res => {
      this.setState({items: res.data});
    });
  }
  render() {
    return (
      <ul>
        {this.state.items.map(item =>
          <li key={item.id}>{item.name}</li>
        )}
      </ul>
    );
  }
}
這里有兩件重要的事情要實(shí)現(xiàn):

  • 組件的狀態(tài)(例如 this.state)從 undefined 開始。
  • 當(dāng)異步獲取數(shù)據(jù)時,不管它是在構(gòu)造函數(shù)componentWillMount還是componentDidMount中獲取的,組件在數(shù)據(jù)加載之前至少會呈現(xiàn)一次,當(dāng) Quiz 第一次呈現(xiàn)時,this.state.items 是未定義的。 這又意味著 ItemList 將 items 定義為 undefined,并且在控制臺中出現(xiàn)錯誤 - “Uncaught TypeError: Cannot read property ‘map’ of undefined”。

       這很容易解決。最簡單的方法:在構(gòu)造函數(shù)中用合理的默認(rèn)值來初始化 state。

Javascript代碼


class Quiz extends Component {
  // Added this:
  constructor(props) {
    super(props);
    // Assign state itself, and a default value for items
    this.state = {
      items: []
    };
  }
  componentWillMount() {
    axios.get('/thedata').then(res => {
      this.setState({items: res.data});
    });
  }
  render() {
    return (
      <ul>
        {this.state.items.map(item =>
          <li key={item.id}>{item.name}</li>
        )}
      </ul>
    );
  }
}

       在你的應(yīng)用程序中的具體代碼可能是不同的,但我們希望我們已經(jīng)給你足夠的線索,以解決或避免在你的應(yīng)用程序中出現(xiàn)的這個問題。如果還沒有,請繼續(xù)閱讀,因?yàn)槲覀儗⒃谙旅娓采w更多相關(guān)錯誤的示例。
        2. TypeError: ‘undefined’ is not an object
        這是在 Safari 中讀取屬性或調(diào)用未定義對象上的方法時發(fā)生的錯誤。您可以在 Safari Developer Console 中輕松測 試。這與 1 中提到的 Chrome 的錯誤基本相同,但 Safari 使用了不同的錯誤消息提示語。

      3.TypeError: null is not an object
        這是在 Safari 中讀取屬性或調(diào)用空對象上的方法時發(fā)生的錯誤。 您可以在 Safari Developer Console 中輕松測試。

有趣的是,在 JavaScript 中,null 和 undefined 是不一樣的,這就是為什么我們看到兩個不同的錯誤信息。undefined 通常是一個尚未分配的變量,而 null 表示該值為空。 要驗(yàn)證它們不相等,請嘗試使用嚴(yán)格的相等運(yùn)算符 ===:  

       在現(xiàn)實(shí)世界的例子中,這種錯誤可能發(fā)生的一種場景是:如果在加載元素之前嘗試在 JavaScript 中使用元素。 因?yàn)?DOM API 對于空白的對象引用返回值為 null。
        任何執(zhí)行和處理 DOM 元素的 JS 代碼都應(yīng)該在創(chuàng)建 DOM 元素之后執(zhí)行。 JS 代碼按照 HTML 中的規(guī)定從上到下進(jìn)行解釋。 所以,如果 DOM 元素之前有一個標(biāo)簽,腳本標(biāo)簽內(nèi)的 JS 代碼將在瀏覽器解析 HTML 頁面時執(zhí)行。 如果在加載腳本之前尚未創(chuàng)建 DOM 元素,則會出現(xiàn)此錯誤。
        在這個例子中,我們可以通過添加一個事件監(jiān)聽器來解決這個問題,這個監(jiān)聽器會在頁面準(zhǔn)備好的時候通知我們。 一旦 addEventListener被觸發(fā),init() 方法就可以使用 DOM 元素。

Html代碼

<script>
  function init() {
    var myButton = document.getElementById("myButton");
    var myTextfield = document.getElementById("myTextfield");
    myButton.onclick = function() {
      var userName = myTextfield.value;
    }
  }
  document.addEventListener('readystatechange', function() {
    if (document.readyState === "complete") {
      init();
    }
  });
</script>
<form>
  <input type="text" id="myTextfield" placeholder="Type your name" />
  <input type="button" id="myButton" value="Go" />
</form>

4. (unknown): Script error 
       當(dāng)未捕獲的 JavaScript 錯誤(通過window.onerror處理程序引發(fā)的錯誤,而不是捕獲在try-catch中)被瀏覽器的跨域策略限制時,會產(chǎn)生這類的腳本錯誤。 例如,如果您將您的 JavaScript 代碼托管在 CDN 上,則任何未被捕獲的錯誤將被報告為“腳本錯誤” 而不是包含有用的堆棧信息。這是一種瀏覽器安全措施,旨在防止跨域傳遞數(shù)據(jù),否則將不允許進(jìn)行通信。 
        要獲得真正的錯誤消息,請執(zhí)行以下操作: 
        1. 發(fā)送 ‘Access-Control-Allow-Origin’ 頭部 
        將 Access-Control-Allow-Origin 標(biāo)頭設(shè)置為 * 表示可以從任何域正確訪問資源。 如有必要,您可以將域替換為您的域:例如,Access-Control-Allow-Origin:www.example.com。 但是,處理多個域會變得棘手,如果你使用 CDN,可能由此產(chǎn)生更多的緩存問題會讓你感覺到這種努力并不值得。 在這里看到更多。 
         這里有一些關(guān)于如何在各種環(huán)境中設(shè)置這個頭文件的例子: 
         在 JavaScript 文件所在的文件夾中,使用以下內(nèi)容創(chuàng)建一個 .htaccess 文件:
代碼

       Header add Access-Control-Allow-Origin "*"  

       將 add_header 指令添加到提供 JavaScript 文件的位置塊中:
代碼

       location ~ ^/assets/ {  add_header Access-Control-Allow-Origin *;  }  

        將以下內(nèi)容添加到您為 JavaScript 文件提供資源服務(wù)的后端: 

代碼 

        rspadd Access-Control-Allow-Origin:\ *  

        在 <script> 中設(shè)置 crossorigin="anonymous"

在您的 HTML 代碼中,對于您設(shè)置了Access-Control-Allow-Origin header 的每個腳本,在 script 標(biāo)簽上設(shè)置crossorigin =“anonymous”。在腳本標(biāo)記中添加 crossorigin 屬性之前,請確保驗(yàn)證上述 header 正確發(fā)送。 在Firefox 中,如果存在crossorigin屬性,但Access-Control-Allow-Origin頭不存在,則腳本將不會執(zhí)行。 

5. TypeError: Object doesn’t support property

       這是您在調(diào)用未定義的方法時發(fā)生在 IE 中的錯誤。 您可以在 IE 開發(fā)者控制臺中進(jìn)行測試。

fcb1e309-0293-3836-a8e5-e6e361a28add.png

       這相當(dāng)于 Chrome 中的 “TypeError:”undefined“ is not a function” 錯誤。 是的,對于相同的邏輯錯誤,不同的瀏覽器可能具有不同的錯誤消息。 
        對于使用 JavaScript 命名空間的 Web 應(yīng)用程序,這是一個 IE l瀏覽器的常見的問題。 在這種情況下,99.9% 的原因是 IE 無法將當(dāng)前名稱空間內(nèi)的方法綁定到 this 關(guān)鍵字。 例如:如果你 JS 中有一個命名空間 Rollbar 以及方法 isAwesome 。 通常,如果您在 Rollbar 命名空間內(nèi),則可以使用以下語法調(diào)用isAwesome方法:
Javascript代碼 

this.isAwesome();  

        Chrome,F(xiàn)irefox 和 Opera 會欣然接受這個語法。 另一方面 IE,不會。 因此,使用 JS 命名空間時最安全的選擇是始終以實(shí)際名稱空間作為前綴。

6. TypeError: ‘undefined’ is not a function
        當(dāng)您調(diào)用未定義的函數(shù)時,這是 Chrome 中產(chǎn)生的錯誤。 您可以在 Chrome 開發(fā)人員控制臺和 Mozilla Firefox 開發(fā)人員控制臺中進(jìn)行測試。 63e43ce7-2048-3c44-9d80-3e8a27b71a56.png

       隨著 JavaScript 編碼技術(shù)和設(shè)計(jì)模式在過去幾年中變得越來越復(fù)雜,回調(diào)和關(guān)閉中的自引用范圍也相應(yīng)增加,這是這種/那種混淆的相當(dāng)常見的來源。
       考慮這個代碼片段:
Javascript代碼

function testFunction() {
  this.clearLocalStorage();
  this.timer = setTimeout(function() {
    this.clearBoard();    // what is "this"?
  }, 0);
};

執(zhí)行上面的代碼會導(dǎo)致以下錯誤:“Uncaught TypeError:undefined is not a function”。 你得到上述錯誤的原因是,當(dāng)你調(diào)用setTimeout()時,實(shí)際上是調(diào)用window.setTimeout()。 因此,在窗口對象的上下文中定義了一個傳遞給setTimeout()的匿名函數(shù),該函數(shù)沒有clearBoard()方法。
一個傳統(tǒng)的,舊瀏覽器兼容的解決方案是簡單地將您的 this 保存在一個變量,然后可以由閉包繼承。 例如:
Javascript代碼 

function testFunction () {
  this.clearLocalStorage();
  var self = this;   // save reference to 'this', while it's still this!
  this.timer = setTimeout(function(){
    self.clearBoard(); 
  }, 0);

};

或者,在較新的瀏覽器中,可以使用bind()方法傳遞適當(dāng)?shù)囊茫?
Javascript代碼

function testFunction () {
  this.clearLocalStorage();
  this.timer = setTimeout(this.reset.bind(this), 0);  // bind to 'this'
};
function testFunction(){
    this.clearBoard();    //back in the context of the right 'this'!
};

7. Uncaught RangeError: Maximum call stack 

        這是 Chrome 在一些情況下會發(fā)生的錯誤。 一個是當(dāng)你調(diào)用一個不終止的遞歸函數(shù)。您可以在 Chrome 開發(fā)者控制臺中進(jìn)行測試。

                     5cadac78-96ee-3a2f-ad3f-493cceae8e0a.png

      此外,如果您將值傳遞給超出范圍的函數(shù),也可能會發(fā)生這種情況。 許多函數(shù)只接受其輸入值的特定范圍的數(shù)字。 例如:Number.toExponential(digits) 和 Number.toFixed(digits) 接受 0 到 20 的數(shù)字,Number.toPrecision(digits) 接受 1 到 21 的數(shù)字。
Javascript代碼

var a = new Array(4294967295);  //OK
var b = new Array(-1); //range error
var num = 2.555555;
document.writeln(num.toExponential(4));  //OK
document.writeln(num.toExponential(-2)); //range error!
num = 2.9999;
document.writeln(num.toFixed(2));   //OK
document.writeln(num.toFixed(25));  //range error!
num = 2.3456;
document.writeln(num.toPrecision(1));   //OK
document.writeln(num.toPrecision(22));  //range error!

8. TypeError: Cannot read property ‘length’

        這是 Chrome 中發(fā)生的錯誤,因?yàn)樽x取未定義變量的長度屬性。 您可以在 Chrome 開發(fā)者控制臺中進(jìn)行測試。
      您通常會在數(shù)組中找到定義的長度,但是如果數(shù)組未初始化或者變量名稱在另一個上下文中隱藏,則可能會遇到此錯誤。讓我們用下面的例子來理解這個錯誤。
Javascript代碼

var testArray = ["Test"];
function testFunction(testArray) {
    for (var i = 0; i < testArray.length; i++) {
      console.log(testArray[i]);
    }
}
testFunction(); 當(dāng)你用參數(shù)聲明一個函數(shù)時,這些參數(shù)變成了函數(shù)作用域內(nèi)的本地參數(shù)。這意味著即使你函數(shù)外有名為 testArray 的變量,在一個函數(shù)中具有相同名字的參數(shù)也會被視為本地參數(shù)。

        您有兩種方法可以解決您的問題:
        1. 刪除函數(shù)聲明語句中的參數(shù)(事實(shí)上你想訪問那些聲明在函數(shù)之外的變量,所以你不需要函數(shù)的參數(shù)):

var testArray = ["Test"];
/* Precondition: defined testArray outside of a function */
function testFunction(/* No params */) {
    for (var i = 0; i < testArray.length; i++) {
      console.log(testArray[i]);
    }
}
testFunction();

      2. 用聲明的數(shù)組調(diào)用該函數(shù):

var testArray = ["Test"];
function testFunction(testArray) {
   for (var i = 0; i < testArray.length; i++) {
      console.log(testArray[i]);
    }
}
testFunction(testArray); 9. Uncaught TypeError: Cannot set property 
        當(dāng)我們嘗試訪問一個未定義的變量時,它總是返回 undefined,我們不能獲取或設(shè)置任何未定義的屬性。 在這種情況下,應(yīng)用程序?qū)伋?“Uncaught TypeError: Cannot set property”。 
       如果測試對象不存在,錯誤將會拋出 “Uncaught TypeErrorUncaught TypeError: Cannot set property”。

10. ReferenceError: event is not defined 
當(dāng)您嘗試訪問未定義的變量或超出當(dāng)前范圍的變量時,會引發(fā)此錯誤。
       如果在使用事件處理系統(tǒng)時遇到此錯誤,請確保使用傳入的事件對象作為參數(shù)。像 IE 這樣的舊瀏覽器提供了一個全局變量事件,但并不是所有瀏覽器都支持。像 jQuery 這樣的庫試圖規(guī)范化這種行為。盡管如此,最好使用傳入事件處理函數(shù)的函數(shù)。
function myFunction(event) {
    event = event.which || event.keyCode;
    if(event.keyCode===13){
       alert(event.keyCode);
    }
}

結(jié)論 
        我們希望你學(xué)到了新的東西,可以避免將來的錯誤,或者本指南幫助你解決了頭痛的問題。 
        盡管如此,即使有最佳實(shí)踐,生產(chǎn)中也會出現(xiàn)意想不到的錯誤。能夠查看影響用戶的錯誤,并擁有快速解決問題的好工具,這一點(diǎn)非常重要。

日歷

鏈接

個人資料

存檔

亚洲av午夜福利精品一区人妖,亚洲乱码日产精品a级毛片久久,91精品视频观看,青草青草久热精品视频在线观看
<strike id="cy2gs"><menu id="cy2gs"></menu></strike>
  • <del id="cy2gs"><dfn id="cy2gs"></dfn></del>
  • 久久综合图片| 国产精品国产三级国产专播品爱网| 亚洲国产视频a| 国户精品久久久久久久久久久不卡| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ入口 | 国产精品亚洲成人| 国产精品igao视频网网址不卡日韩| 欧美午夜剧场| 国产精品私房写真福利视频| 国产精一区二区三区| 国产欧美精品日韩| 国产亚洲一区二区三区| 狠狠色狠狠色综合日日五| 尤物九九久久国产精品的特点 | 亚洲理伦在线| 亚洲精品影院在线观看| 日韩视频免费| 亚洲自拍偷拍色片视频| 欧美伊人久久| 久久全球大尺度高清视频| 欧美成熟视频| 欧美天天在线| 国产精品一区二区三区四区| 国内精品久久久| 亚洲国产欧美在线| 日韩视频欧美视频| 亚洲一区视频在线| 久久精品九九| 欧美大色视频| 国产精品久久久久久久免费软件| 国产三级精品在线不卡| 影音先锋日韩资源| 亚洲人成在线影院| 亚洲午夜av| 久久精品盗摄| 欧美韩日一区二区| 国产精品久久久久久久久| 国产午夜亚洲精品羞羞网站| 亚洲第一网站| 中文在线不卡| 久久蜜桃av一区精品变态类天堂| 欧美精品乱人伦久久久久久 | 久久精品视频免费播放| 欧美大片一区二区三区| 国产精品国产三级国产a| 国产在线拍偷自揄拍精品| 亚洲国产另类久久久精品极度| 亚洲最新色图| 久久九九精品| 欧美视频日韩视频| 极品少妇一区二区| 亚洲视频一二区| 鲁大师成人一区二区三区| 欧美三级日韩三级国产三级| 国模私拍视频一区| 一区二区三区四区五区在线| 久久久之久亚州精品露出| 欧美视频在线一区二区三区| 好男人免费精品视频| 99riav国产精品| 久久久久久一区| 欧美三区在线观看| 伊人夜夜躁av伊人久久| 亚洲一区二区三区视频| 麻豆成人av| 国产精品久久久一本精品| 黄色一区三区| 午夜国产精品视频免费体验区| 欧美成人xxx| 国产一区二区三区在线免费观看| 一区二区高清视频在线观看| 久久免费高清| 国产精品一区三区| 亚洲精选在线| 久久中文在线| 国产日产亚洲精品| 在线视频亚洲| 欧美国产一区二区在线观看| 国产综合在线视频| 亚洲欧美日本国产有色| 欧美日本高清一区| 依依成人综合视频| 欧美一区二区私人影院日本| 欧美日韩一区二区三区在线看 | 欧美日韩1区| 在线视频观看日韩| 欧美一区二区三区电影在线观看| 欧美日韩精品在线| 亚洲福利小视频| 久久久.com| 国产日韩欧美综合一区| 亚洲一区二区日本| 欧美日韩国产一级| 91久久综合亚洲鲁鲁五月天| 久久久久国产精品一区| 国产精品一区二区久久国产| 一本色道久久综合亚洲精品高清| 欧美高清视频一区二区| 一区二区三区在线观看国产| 欧美一区成人| 国产精品日韩专区| 亚洲婷婷综合久久一本伊一区| 欧美欧美天天天天操| 91久久综合亚洲鲁鲁五月天| 久久躁日日躁aaaaxxxx| 韩国av一区二区三区| 性久久久久久久久| 国产精品视频xxxx| 亚洲欧美一区二区三区极速播放| 久久精品国产成人| 国产精品综合色区在线观看| 一区二区高清视频| 欧美成人影音| 在线观看亚洲专区| 欧美一区三区三区高中清蜜桃| 国产精品麻豆成人av电影艾秋| 日韩亚洲视频在线| 欧美精品一区视频| 亚洲美女视频网| 在线观看91久久久久久| 久久久久天天天天| 国产日韩视频| 性亚洲最疯狂xxxx高清| 国产精品久久久久久一区二区三区| 亚洲最快最全在线视频| 欧美美女bbbb| 一区二区三区精品视频| 欧美日韩一区二区在线观看| 在线亚洲欧美| 国产精品亚洲综合色区韩国| 性欧美1819性猛交| 国产午夜亚洲精品理论片色戒| 欧美影院一区| 国产亚洲精品一区二555| 久久久久久久久久久成人| 精品成人在线视频| 免费观看日韩av| 亚洲免费观看| 欧美亚一区二区| 性欧美超级视频| 极品尤物一区二区三区| 免费视频亚洲| 一二三区精品福利视频| 国产精品日韩欧美一区| 欧美在线免费视屏| 樱花yy私人影院亚洲| 欧美国产欧美亚洲国产日韩mv天天看完整 | 在线一区二区三区做爰视频网站| 国产精品二区在线| 欧美一区二区三区久久精品茉莉花| 国产丝袜美腿一区二区三区| 久久久人人人| 亚洲人成网站色ww在线| 欧美午夜大胆人体| 性欧美xxxx视频在线观看| 永久久久久久| 欧美日韩国产另类不卡| 亚洲免费在线观看| 国内精品伊人久久久久av一坑| 欧美成人精品一区| 亚洲免费一在线| 今天的高清视频免费播放成人 | 欧美自拍偷拍午夜视频| 国产欧美一区二区精品性色| 亚洲视频你懂的| 国产一区二区三区高清| 欧美福利电影网| 亚洲欧美一区二区原创| 精品99视频| 欧美日韩一视频区二区| 欧美一区二区三区在线免费观看| 伊人久久亚洲影院| 欧美日韩亚洲一区三区 | 亚洲高清影视| 国产精品va在线| 久久夜色精品国产噜噜av| 日韩一区二区精品| 国产日韩欧美在线看| 欧美高清一区| 欧美在线观看视频| 亚洲美女在线看| 国一区二区在线观看| 欧美三区不卡| 欧美a一区二区| 性做久久久久久免费观看欧美| 亚洲国产成人在线视频| 国产精品美女主播| 欧美电影免费观看高清| 欧美一区二区三区四区夜夜大片| 亚洲精品一级| 精品91视频| 国产美女精品视频免费观看| 欧美—级在线免费片| 久久久99国产精品免费| 亚洲一区二区三| 亚洲清纯自拍| 狠狠色丁香婷婷综合久久片| 国产精品美女久久久久久久| 欧美交受高潮1| 久久综合狠狠综合久久综青草|