分析兩道javascript面試題-主要考查的是javascript基本語法知識

第一題:試題如下

本題主要考查的是變量、詞法作用域及以原型爲基礎的實現繼承機制。

首先,我們知道詞法作用有全局變量及局部變量,同時,在javascript局部變量沒有塊級作用域這個概念。

在頂層代碼聲明的變量是全局變量,並且在函數內不使用var聲明的變量也是。

在函數內聲明局部變量,一定要使用var,否則,它就是全局變量。局部變量沒有塊級作用域這個概念,也就是可以在任何位置聲明者變量,但是在沒有初始化之前使用它,它的值爲undefined。

其次,以原型爲基礎的實現繼承機制,主要體現在讀更寫不對稱。讀屬性也就是查詢屬性,當查詢屬性時,判斷這個對象有沒有

此屬性,若有,則使用該屬性,否則查詢此對象的prototype對象,如此循環...。當然,假設都沒有,直到Object.prototype這個對象結束,若還沒有,則爲undefined。在寫屬性時,是不啓用原型機制的。直接給該對象添加屬性或者方法。

OK。

現在來看一下上面的這道題。

首先是一個構造函數。

在構造函數裏面:有一個 靜態方法 foo.abc,有個一個實例方法this.abc,有一個嵌套直接量函數abc,並且注意:因爲構造函數最後一行聲明此函數使用了var,故此直接量函數是局部變量。

foo.prototype.abc=function(){alert("Alisoft");};//可以讓所有的foo實例對象繼承abc方法。

foo.abc=function(){alert("yahoo");};//定義一個類方法

var  obj=new foo();//新建一個對象

obj.abc();//此處爲調用對象的方法abc,也就是查詢,故先看obj有沒有abc方法,我們知道在構造函數裏有此方法this.abc.所以,不需要道該對象prototype對象中去查詢,此結果爲"Alimama".

foo.abc();//此處調用類方法即靜態方法。我們知道,有兩處定義了靜態方法,一個是在構造函數裏面,另一個在外面,由於在此處前面,我們調用構造函數新建了一個對象,並且構造函數裏重置類foo.abc=function(){alert("Alibaba");},故會把外面定義的靜態方法foo.abc=fucntion(){alert("Yahoo");}覆蓋;並且function(){alert("Yahoo");}這對象被javascript解釋器自動處理。所有此處的結果爲"Alibaba".

當然,我們假設在新建obj這個對象之前調用foo.abc()靜態方法。則結果爲"Yahoo".

abc();//此處調用的全局變量。而我們知道在函數構造體內的abc函數是局部變量,局部變量的作用只在此函數體內有效。由於沒定義這個全局變量。所義此結果爲"undefined".

第二道:


請問x,y,z的值爲多少?

這個題目簡單,由於兩個函數都沒有 使用return, 返回一個值,則函數返回的值是undefined。故x,y的爲undefined。

那麼z的爲NaN了。

好好太有意思了吧!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章