關於javascript基礎的認識

下面全部的東西都不爲堆高個人編程能力,因此我只是把對JS的認識用最粗鄙的語言進行講解和記錄,因此,閱讀需謹慎!前端

JS執行

  1. JS在執行以前會先進行編譯。這第一句話均可能被我帶壞了,畢竟市面上都是說JS是動態的解釋執行語言,但那又如何?!知道JS在執行以前是先進行‘編譯’的就好。且看下面編程

    console.log(a);//undefined
    //把它複製到js文件裏,並對下面一行打上斷點,看控制檯輸出的是什麼?undefined!說明在執行前進行了‘編譯’
    //提醒:最好是在沒有安裝插件的瀏覽器環境執行,要不控制檯可能會出現因插件帶來的異常信息
    console.log(b);//Uncaught ReferenceError: b is not defined
    var a='a';

    對於上面的代碼還要注意:
    JS存在變量提高的行爲,即會把聲明的變量提高到當前執行上下文的最頂端
    因此console.log(a)輸出的是undefined,注意!是undefined!不是a!變量提高提高的是變量的聲明,而不是先執行var a='a'這句話。而console.log(b)卻會拋出一個異常,雖然都是‘沒定義’但必定要分清a是undefined,b是not defined是變量沒有聲明,是一個會阻塞JS執行的ReferenceError異常
    另外ReferenceError異常同做用域判斷失敗相關數組

  2. 堆棧
    不要問我什麼是堆棧,我也不知道,不過我一般這麼理解:堆,是存放數據的堆內存;棧就是用來執行的盒子容器(真的會被我帶壞,哈哈哈),這裏講棧,其實通俗來講,棧就是堆棧。瀏覽器

    • 棧遵循先進後出,後進先出的特色,進出的是執行上下文,最早進入的全局上下文,而且在瀏覽器關閉時才被彈出異步

    • JS雖然說是單線程的,但也能實現一些異步特性,進入堆棧的就有這麼兩種狀況:同步狀況和異步狀況函數

      • 同步狀況固然是當下進入this

      • 異步狀況常見的包括兩種:延時和事件監聽,事件監聽常如AJAX,當他們的回掉函數執行時才建立其執行的上下文放入棧中:插件

      setTimeout(function () {
          console.log(1);
      });
      console.log(2);

      是否是先打印的2?雖然這裏並無設置時長,但依舊先執行console.log(2),這即是堆棧的機制,JS執行的機制表現線程

做用域

這個東西簡單、老生常談,但若是稍不留意仍是會常常出錯,然而這裏我只說幾點不直觀的演示和講解指針

  1. 變量提高會先提高函數而後纔是變量,見下

    fa();//fa
    fb();//Uncaught TypeError: fb is not a function
    //fb()的異常錯誤表明變量已被聲明且做用域判斷成功,但因還沒定義形成的用方錯誤
    function fa() {
        console.log('fa');
    }
    var fb=function () {
        console.log('fb');
    };

    因此,爲了不混亂,也是推薦的規範寫法,之後的函數聲明仍是用變量聲明吧。

  2. 循環結構和條件結構的用花括號包裹的代碼塊並不會建立新的做用域,也不是真正的代碼塊,以下

    (function(){
        for(var i=0;i<6;i++){
            if(i===3){
                var b=i;
                return false;
            }
            console.log(b);//三次undefined
        }
    })();

    注意:ES6的let const已作改進

類型

不是說數據類型哈!
JS包括基本類型和引用類型

  • 基本類型即直接存放在內存中的,能夠直接訪問的,其包括number string boolean null undefined

  • 引用類型即存放在內存中的對象,實際保存的是一個指針,一個引用,其包括object array function,且看下面的代碼

    var a=[1,2,3,4];
    var b=a;
    b[0]=6;
    console.log(a);//[6, 2, 3, 4]

弱類型

這個沒什麼好說的,但異常每每老是所以發生,哪怕不是什麼複雜的工程。因此對純前端尤爲值得一提,不只要知道怎麼進行數據類型的轉換更要清楚的知道你當下在操做的是什麼數據類型。另外,建議使用全判斷,即如==替換爲===

函數

依舊不負責任的說:我不知道js一切皆對象是對是錯,該怎麼表述它纔是對的或錯的,但除原始值(或者上面說的基本類型)是對象是毫無疑問的,也正式如此,才讓函數能有多種身份:普通函數、對象的方法、對象的構造器、對象
—————————————————————佔位————————————————————————

其餘

  • function免費配送了除了this以外的arguments參數,這個在咱們不清楚該函數傳過來那些參數時比較有用

  • JS的數組實際上是對象,是arraylike的對象,因此for等循環不只能夠操做數組也能夠操做對象,因此也能夠給數組添加非整型下標,另外數組的長度是根據整型做爲下標的最大值+1得來的

相關文章
相關標籤/搜索