目錄
1、使用
var
聲明變量、使用
;
結尾、使用
{}
表示代碼塊、使用駝峰式命名
2、變量是弱類型的,即并不嚴格要求聲明變量的類型,一個變量可以在運作期間動态的指向不同類型的資料
3、變量聲明後可以不定義(或叫指派、初始化),此時它的值是
undefined
4、符号
$
可以作為命名開頭的特殊字母,
jQuery
使用它作為
jquery
函數的别名
5、資料分為兩大類:原始資料和引用資料,是以一個變量中儲存的值自然也有兩類
原始資料:直接存放在棧中, 變量中儲存着此資料的直接值
引用資料:存放在堆中,并把記憶體位址存放在棧中,即變量中存放着此對象的指針
6、原始類型:
undefined
、
boolean
number
string
null
7、引用類型:即對象
object
,其他
array
function
等對象都是在
object
基礎上進一步封裝的對象
1、函數也是一個對象,構造函數在功能上還類似于一個類
2、函數如果沒有顯式說明傳回值,則預設
return undefined
3、函數對輸入參數的要求并不嚴格(數量、類型),可以使用
arguments
來獲得一個函數的輸入參數數組
4、函數也是一個對象意味着,函數可以被當做輸入參數、也可以被
return
,這就意味着可以實作閉包
5、函數的
toString()
方法可以得到函數的源代碼
6、閉包,儲存了函數定義時上下文的執行環境,當函數執行時,可以擷取到這些資料
閉包的支援意味着可以完成裝飾器模式
7、函數聲明和函數表達式在某些環境下有非常大的差別
函數聲明:
function show(){}
函數表達式:
var show = function(){}
函數聲明有很高的優先級,會被解釋器提前解析并釋放到執行環境中()
console.log(show) // 可以正常的列印出show函數對象
function show(){}
以上兩句語句可以正常執行而不報錯,全局代碼被掃描的時候通過詞法分析會在目前函數的AO對象中設定show變量的值為對應函數
而函數表達式等價于一個指派語句,隻有在運作此句代碼時才執行,一下語句會報錯
console.log(show)
var show = function(){}
8、詞法分析,一個函數在被真正執行内部代碼前,解釋器會先掃描函數源代碼并執行詞法分析,目的是提前完成函數作用域的生成,
函數作用域通過一個
AO
對象來儲存,後續在逐行執行函數代碼時,所有的變量查詢都通過
AO
對象,詞法分析步驟:
a、分析函數輸入參數,若函數源代碼出現輸入參數,則發生此步驟。解釋器在
AO
對象中添加此屬性,值為
undefined
,若有接收實參,則覆寫原有的值
b、分析變量,若函數源代碼中出現變量定義,則發生此步驟。解釋器尋找
AO
對象中是否有此屬性,若無則增加,值為
undefined
,若有,什麼也不做
c、分析函數聲明,若函數源代碼中出現函數聲明(函數表達式會被定義為步驟b),則發生此步驟。解釋器尋找
AO
對象是否有此屬性,若無則增加,若有,則覆寫
換句話說,如果在一個函數
func1
内部有另一個函數聲明
func2
,此
func1
函數在真正被執行内部代碼前就已經生成了
AO
對象并且
func2
函數已經在
func1
函數的作用域中
1、
js
對象類似于
Python
中的字典,裡面存放着無序的鍵值對
2、對象中的屬性(資料屬性、函數屬性)權限均為公開的(和
Python
一樣),使用
_xxx_
的方式約定俗成的表示成私有資料(
Python
中使用
__xxx
)
3、
this
指代目前對象,尤其在構造函數中使用時,指代目前被初始化的對象(類似
Python
的
__init__
中的
self
4、如何定義一個類(實際是構造函數)
a、構造函數定義資料+原型定義函數(我個人比較常用此種方式,代碼清晰)
function Stu(stuName, stuAge){
this.stuName = stuName;
this.stuAge = stuAge;
}
Stu.prototype.goToSchool = function(schoolName){
console.log(this.stuName + ' is going to school: ' + schoolName);
}
b、構造函數定義資料+函數(這種模型也可以用于處理單例模式)
function Stu(stuName, stuAge){
this.stuName = stuName;
this.stuAge = stuAge;
if(!Stu.__definedFlag){ //實際上此函數被當做單例模式
Stu.prototype.goToSchool = function(schoolName){
console.log(this.stuName + ' is going to school: ' + schoolName);
}
var Stu.__definedFlag = true;
}
}