淺析Js之」變量」篇

1、JS中變量與函數的使用

1.變量

JS中的數據類型

基本數據類型 引用數據類型
數值(number) 對象(Object
字符串(String 函數(Function
布爾(Boolean 數組(Array)
Undefined
空(Null

判斷數據的類型,使用typeof這個運算符。數組

<script>
    console.log(typeof undefined);  // undefined
    console.log(typeof 'absdef');   // string
    console.log(typeof 123456);     // number
    console.log(typeof true);       // boolean
    console.log(typeof function(){});//Function
    console.log(typeof {});         // object
    console.log(typeof []);         // object
    console.log(typeof null);       // object
    console.log(typeof console.log);
    </script>
複製代碼

變量提高

var 的變量會提高,沒有var的變量不會提高。(提高是指提高到了代碼段的第一行。)bash

(1)普通的var變量,確定要提高。

<scirpt>
console.log(a); //undefined
var a = 100;
console.log(a); //110
</script>
複製代碼

(2)循環內部中的var變量,也會提高。

<scirpt>
console.log(i,j); //undefined undefined
for(var i=0;i<10;i++){
    for(var j=0;j<10;j++){
        
    }
}
console.log(i,j); //10 10
</script>

複製代碼

(3)在函數中的var變量,也是能夠提高的。

<script>
function f(){
    console.log(a); //undefined
    var a =110;
    console.log(a);//110
}
f();
</script>
複製代碼

注意:在函數中的變量的提高,並非提高到了代碼段的第一行,而是提高到了函數內部的第一行異步


2.函數

函數的提高

函數在JS中,主要分兩類:一類是函數聲明 ,另外一類是函數表達式。

(1)函數聲明提高

<script>
f();  
function f(){
    console.log("f..."); //f...
}
</script>
複製代碼

(2)函數表達式不提高

<script>
g();
var g =function (){
console.log("g...");//報錯
}
</script>
複製代碼

注意:提高是發生在同一個代碼段中,是不能提高到上一個代碼段中的。函數

2、進程和線程的區別?

(1)進程是資源的分配和調度的一個獨立單元,而線程是CPU調度的基本單元spa

(2)同一個進程中能夠包括多個線程,而且線程共享整個進程的資源(寄存器、堆棧、上下文),一個進程至少包括一個線程。操作系統

(3)進程的建立調用fork或者vfork,而線程的建立調用pthread_create,進程結束後它擁有的全部線程都將銷燬,而線程的結束不會影響同個進程中的其餘線程的結束線程

(4)線程是輕兩級的進程,它的建立和銷燬所須要的時間比進程小不少,全部操做系統中的執行功能都是建立線程去完成的 (5)線程中執行時通常都要進行同步和互斥,由於他們共享同一進程的全部資源code

(6)線程有本身的私有屬性TCB,線程id,寄存器、硬件上下文,而進程也有本身的私有屬性進程控制塊PCB,這些私有屬性是不被共享的,用來標示一個進程或一個線程的標誌cdn

阻塞與非阻塞

阻塞調用是指調用結果返回以前,調用者會進入阻塞狀態等待。只有在獲得結果以後纔會返回。對象

非阻塞調用是指在不能馬上獲得結果以前,該函數不會阻塞當前線程,而會馬上返回。

一個線程/進程經歷的5個狀態,建立,就緒,運行,阻塞,終止。各個狀態的轉換條件如上圖,其中有個阻塞狀態,就是說當線程中調用某個函數,須要IO請求,或者暫時得不到競爭資源的,操做系統會把該線程阻塞起來,避免浪費CPU資源,等到獲得了資源,再變成就緒狀態,等待CPU調度運行。

同步與異步

同步:在發出一個同步調用時,在沒有獲得結果以前,該調用就不返回。

異步:在發出一個異步調用後,調用者不會馬上獲得結果,該調用就返回了。

同步的定義看起來跟阻塞很像,可是同步跟阻塞是兩個概念,同步調用的時候,線程不必定阻塞,調用雖然沒返回,但它仍是在運行狀態中的,CPU極可能還在執行這段代碼,而阻塞的話,它就確定不在CPU中跑這個代碼了。這就是同步和阻塞的區別。同步是確定能夠在,阻塞是確定不在。

異步和非阻塞的定義比較像,二者的區別是異步是說調用的時候結果不會立刻返回,線程可能被阻塞起來,也可能不阻塞,二者不要緊。非阻塞是說調用的時候,線程確定不會進入阻塞狀態。

上面兩組概念,就有4種組合。

同步阻塞調用:得不到結果不返回,線程進入阻塞態等待。

同步非阻塞調用:得不到結果不返回,線程不阻塞一直在CPU運行。

異步阻塞調用:去到別的線程,讓別的線程阻塞起來等待結果,本身不阻塞。

異步非阻塞調用:去到別的線程,別的線程一直在運行,直到得出結果。

相關文章
相關標籤/搜索