1.Javascript作用鏈域?
全局函數無法查看局部函數的內部細節,但局部函數可以查看其上層的函數細節,直至全局細節。
當需要從局部函數查找某一屬性或方法時,如果當前作用域沒有找到,就會上溯到上層作用域查找,直至全局函數,這種組織形式就是作用域鏈。
作用域鏈的作用是保證執行環境裡有權訪問的變量和函數是有序的,作用域鏈的變量只能向上訪問,變量訪問到window對象即被終止,作用域鏈向下訪問變量是不被允許的。
2.什麼是閉包(closure),為什麼要用它?
閉包是指有權訪問另一個函數作用域中變量的函數,創建閉包的最常見的方式就是在一個函數內創建另一個函數,通過另一個函數訪問這個函數的局部變量,利用閉包可以突破作用鏈域,將函數內部的變量和方法傳遞到外部。
使用閉包主要是為了設計私有的方法和變量。閉包的優點是可以避免全局變量的汙染,缺點是閉包會常駐內存,會增大內存使用量,使用不當很容易造成內存洩露。在js中,函數即閉包,只有函數才會產生作用域的概念
閉包的特性:
- 函數內再嵌套函數
- 內部函數可以引用外層的參數和變量
- 參數和變量不會被垃圾回收機制回收
執行say667()後,say667()閉包內部變量會存在,而閉包內部函數的內部變量不會存在
使得Javascript的垃圾回收機制GC不會收回say667()所佔用的資源
因為say667()的內部函數的執行需要依賴say667()中的變量
這是對閉包作用的非常直白的描述
3.什麼是偽數組?
偽數組是能通過Array.prototype.slice 轉換為真正的數組的帶有length屬性的對象
比如arguments對象,還有像調用getElementsByTagName,document.childNodes之類的,它們都返回NodeList對象都屬於偽數組
我們可以通過Array.prototype.slice.call(fakeArray)將偽數組轉變為真正的Array對象: 返回新數組而不會修改原數組
4.javascript創建對象的幾種方式?
javascript創建對象簡單的說,無非就是使用內置對象或各種自定義對象,當然還可以用JSON;但寫法有很多種,也能混合使用。
1、對象字面量的方式
2、用function來模擬無參的構造函數
3、用function來模擬參構造函數來實現(用this關鍵字定義構造的上下文屬性)
4、用工廠方式來創建(內置對象)
5、用原型方式來創建
6、用混合方式來創建
4.談談This對象的理解。
- this總是指向函數的直接調用者(而非間接調用者);
- 如果有new關鍵字,this指向new出來的那個對象;
- 在事件中,this指向觸發這個事件的對象,特殊的是,IE中的attachEvent中的this總是指向全局對象Window;
5.JavaScript原型,原型鏈? 有什麼特點?
每個對象都會在其內部初始化一個屬性,就是prototype(原型),當我們訪問一個對象的屬性時,如果這個對象內部不存在這個屬性,那麼他就會去prototype裡找這個屬性,這個prototype又會有自己的prototype,於是就這樣一直找下去,也就是我們平時所說的原型鏈的概念。
關係:instance.constructor.prototype = instance.__proto__
特點:
JavaScript對象是通過引用來傳遞的,我們創建的每個新對象實體中並沒有一份屬於自己的原型副本。當我們修改原型時,與之相關的對象也會繼承這一改變。
當我們需要一個屬性的時,Javascript引擎會先看當前對象中是否有這個屬性, 如果沒有的話,就會查找他的Prototype對象是否有這個屬性,如此遞推下去,一直檢索到 Object 內建對象。
6.javascript中call()和apply()方法的區別?
ECMAScript規範給所有函數都定義了這兩個方法call()和apply()。
call()和apply()都能繼承另一個對象的方法和屬性,區別在於參數列表不一樣
Function.call(obj, arg1, arg2,...)和Function.apply(obj, args) 的第一個參數都是要調用的函數的對象,call()的剩餘參數是傳遞給要調用的函數的值,而apply()只有兩個參數,第一個是對象,第二個是數組,這個數組就是該函數的參數。
7.Javascript如何實現繼承?
- 構造繼承
- 原型繼承
- 實例繼承
- 拷貝繼承
8.如何判斷一個對象是否屬於某個類?
使用instanceof
閱讀更多 計算機語言 的文章