JS基礎學習第五天

做用域

做用域簡單來講就是一個變量的做用範圍。
在JS中做用域分紅兩種:瀏覽器

1.全局做用域函數

直接在script標籤中編寫的代碼都運行在全局做用域中
全局做用域在打開頁面時建立,在頁面關閉時銷燬。
全局做用域中有一個全局對象window,window對象由瀏覽器提供,
能夠在頁面中直接使用,它表明的是整個的瀏覽器的窗口。
在全局做用域中建立的變量都會做爲window對象的屬性保存
在全局做用域中建立的函數都會做爲window對象的方法保存
在全局做用域中建立的變量和函數能夠在頁面的任意位置訪問。
在函數做用域中也能夠訪問到全局做用域的變量。
儘可能不要在全局中建立函數和變量。學習

2.函數做用域this

函數做用域是函數執行時建立的做用域,每次調用函數都會建立一個新的函數做用域。
函數做用域在函數執行時建立,在函數執行結束時銷燬。
在函數做用域中建立的變量,不能在全局中訪問。
當在函數做用域中使用一個變量時,它會先在自身做用域中尋找,
若是找到了則直接使用,若是沒有找到則到上一級做用域中尋找,
若是找到了則使用,找不到則繼續向上找,一直會找至全局做用域。spa

變量的聲明提早prototype

在全局做用域中,使用var關鍵字聲明的變量會在全部的代碼執行以前被聲明,可是不會賦值。
因此咱們能夠在變量聲明前使用變量。可是不使用var關鍵字聲明的變量不會被聲明提早。
在函數做用域中,也具備該特性,使用var關鍵字聲明的變量會在函數全部的代碼執行前被聲明,
若是沒有使用var關鍵字聲明變量,則變量會變成全局變量3d

函數的聲明提早code

在全局做用域中,使用函數聲明建立的函數(function fun(){}),會在全部的代碼執行以前被建立,
也就是咱們能夠在函數聲明前去調用函數,可是使用函數表達式(var fun = function(){})建立的函數沒有該特性
在函數做用域中,使用函數聲明建立的函數,會在全部的函數中的代碼執行以前就被建立好了。對象

this

咱們每次調用函數時,解析器(瀏覽器)都會向函數內部傳遞一個隱含的參數,這個隱含的參數就是this,
this指向的是一個對象,這個對象稱爲函數執行的上下文對象,根據函數的調用形式不一樣,this會指向不一樣的對象。blog

this的不一樣的狀況:
1.它所在函數以函數的形式調用時,this是window
2.它所在函數以方法的形式調用時,this就是調用方法的對象
3.它所在函數以構造函數的形式調用時,this就是新建立的對象

 

工廠方法

使用工廠方法能夠大批量地建立對象

 

構造函數

構造函數就是一個普通的函數,建立方式和普通函數沒有區別,不過首字母要大寫。

構造函數和普通的函數區別是,他的調用方式不一樣。
若是直接調用,它就是一個普通函數。
若是使用new來調用,則它就是一個構造函數。

使用一個構造函數建立的對象,咱們稱爲一類對象,也將構造函數稱爲一個類。(構造函數就是類)
經過同一個構造函數建立的對象,成爲該類的實例。

構造函數的執行流程:
1.馬上建立一個新的對象
2.將新的對象設置爲函數中的this,在構造函數中可使用this來引用新建的對象
3.逐行執行函數中的代碼
4.將新建的對象做爲返回值返回

instanceof 用來檢查一個對象是不是一個類的實例
語法:對象 instanceof 構造函數
若是該對象時構造函數的實例,則返回true,不然返回false

Object是全部對象的祖先,因此任何對象和Object作instanceof都會返回true

原型(prototype)

咱們建立的每個函數,解析器都會向函數中添加一個屬性prototype
這個屬性對應着一個對象,這個對象就是咱們所謂的原型對象。

當函數做爲普通函數調用時,prototype沒有任何做用

當函數做爲構造函數調用時,它所建立的對象中都會有一個隱含的屬性,指向該構造函數的原型對象,咱們能夠經過_proto_來訪問該屬性。

原型對象就至關於一個公共的區域,全部同一個類的實例均可以訪問到這個原型對象。
咱們能夠將對象中共有的屬性和方法統一添加到原型對象中,
這樣咱們只須要添加一次,就可使全部的對象均可以使用這些屬性和方法,不須要爲每個對象去添加,也不會影響到全局做用域。

當咱們去訪問對象的一個屬性或方法時,它會先在對象自身中尋找,
若是在自身中找到了,則直接使用。
若是沒有找到,則去原型對象中尋找,若是找到了則使用,
若是沒有找到,則去原型的原型中尋找,直到找到Object的原型爲止,Object的原型沒有原型,值爲null,
若是依然沒有找到該屬性或方法則返回undefined。

 

 

hasOwnProperty()

這個方法能夠用來檢查對象自身中是否含有某個屬性,使用該方法時只有對象自身中含有屬性時,纔會返回true。(而使用in檢查時,若是對象中沒有可是原型中有,也會返回true)
語法:對象.hasOwnProperty(「屬性名」)

toString方法

當咱們直接在頁面中打印一個對象時,事件上是輸出的對象的toString()方法的返回值

若是咱們但願在輸出對象時不輸出[object Object],能夠爲對象添加一個toString()方法

1
2
3
4
//修改Person原型的toString 
Person.prototype.toString = function(){
return "Person[name="+this.name+",age="+this.age+",gender="+this.gender+"]";
};

如今的瀏覽器控制檯都直接輸出對象所在類及其全部屬性了,因此上訴內容僅供學習使用。

垃圾回收(GC)

就像人生活的時間長了會產生垃圾同樣,程序運行過程當中也會產生垃圾
這些垃圾積攢過多之後,會致使程序運行的速度過慢,
因此咱們須要一個垃圾回收的機制,來處理程序運行過程當中產生垃圾
當一個對象沒有任何的變量或屬性對它進行引用,此時咱們將永遠沒法操做該對象,
此時這種對象就是一個垃圾,這種對象過多會佔用大量的內存空間,致使程序運行變慢,
因此這種垃圾必須進行清理。
在JS中擁有自動的垃圾回收機制,會自動將這些垃圾對象從內存中銷燬,
咱們不須要也不能進行垃圾回收的操做
咱們須要作的只是要將再也不使用的對象設置null便可。

 

學識淺薄,若有錯誤,懇請斧正,在下不勝感激。

相關文章
相關標籤/搜索