JS:前端面試題(三)

1.Javascript作用鏈域?

全局函數無法查看局部函數的內部細節,但局部函數可以查看其上層的函數細節,直至全局細節。

當需要從局部函數查找某一屬性或方法時,如果當前作用域沒有找到,就會上溯到上層作用域查找,直至全局函數,這種組織形式就是作用域鏈。

作用域鏈的作用是保證執行環境裡有權訪問的變量和函數是有序的,作用域鏈的變量只能向上訪問,變量訪問到window對象即被終止,作用域鏈向下訪問變量是不被允許的。

2.什麼是閉包(closure),為什麼要用它?

閉包是指有權訪問另一個函數作用域中變量的函數,創建閉包的最常見的方式就是在一個函數內創建另一個函數,通過另一個函數訪問這個函數的局部變量,利用閉包可以突破作用鏈域,將函數內部的變量和方法傳遞到外部。

使用閉包主要是為了設計私有的方法和變量。閉包的優點是可以避免全局變量的汙染,缺點是閉包會常駐內存,會增大內存使用量,使用不當很容易造成內存洩露。在js中,函數即閉包,只有函數才會產生作用域的概念

閉包的特性:

  1. 函數內再嵌套函數
  2. 內部函數可以引用外層的參數和變量
  3. 參數和變量不會被垃圾回收機制回收
JS:前端面試題(三)

執行say667()後,say667()閉包內部變量會存在,而閉包內部函數的內部變量不會存在

使得Javascript的垃圾回收機制GC不會收回say667()所佔用的資源

因為say667()的內部函數的執行需要依賴say667()中的變量

這是對閉包作用的非常直白的描述

JS:前端面試題(三)

3.什麼是偽數組?

偽數組是能通過Array.prototype.slice 轉換為真正的數組的帶有length屬性的對象

比如arguments對象,還有像調用getElementsByTagName,document.childNodes之類的,它們都返回NodeList對象都屬於偽數組

我們可以通過Array.prototype.slice.call(fakeArray)將偽數組轉變為真正的Array對象: 返回新數組而不會修改原數組

4.javascript創建對象的幾種方式?

javascript創建對象簡單的說,無非就是使用內置對象或各種自定義對象,當然還可以用JSON;但寫法有很多種,也能混合使用。

1、對象字面量的方式

JS:前端面試題(三)

2、用function來模擬無參的構造函數

JS:前端面試題(三)

3、用function來模擬參構造函數來實現(用this關鍵字定義構造的上下文屬性)

JS:前端面試題(三)

4、用工廠方式來創建(內置對象)

JS:前端面試題(三)

5、用原型方式來創建

JS:前端面試題(三)

6、用混合方式來創建

JS:前端面試題(三)

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 內建對象。

JS:前端面試題(三)

6.javascript中call()和apply()方法的區別?

ECMAScript規範給所有函數都定義了這兩個方法call()和apply()。

call()和apply()都能繼承另一個對象的方法和屬性,區別在於參數列表不一樣

Function.call(obj, arg1, arg2,...)和Function.apply(obj, args) 的第一個參數都是要調用的函數的對象,call()的剩餘參數是傳遞給要調用的函數的值,而apply()只有兩個參數,第一個是對象,第二個是數組,這個數組就是該函數的參數。

JS:前端面試題(三)

7.Javascript如何實現繼承?

  1. 構造繼承
  2. 原型繼承
  3. 實例繼承
  4. 拷貝繼承

8.如何判斷一個對象是否屬於某個類?

使用instanceof

JS:前端面試題(三)


分享到:


相關文章: