在班上無聊的時候看到了一份JS筆試題(我是電面進去的,沒作過這份題~~),開始還以爲蠻簡單。。。。。。後來以爲仍是頗有意思的,貼出來一塊兒看看。html
題目一:web
if(!("a" in window)){ var a = 1; } alert(a);
題目二:函數
var a=1, b= function a(x){ x&&a(-xx); }; alert(a);
題目三:this
function a(x){ .. return x*2; .. } var a; alert (a);
題目四:spa
function b(x,y,a){ .. arguments[2] = 10; .. alert(a); .. } b(1,2,3);
題目五:3d
function a() { alert(this); } a.call(null);
題目六:
寫深度克隆的代碼。code
答案和分析:orm
題目一,有人認爲a沒有存在window裏面,因此輸出a=1,還有人認爲a在私有做用域,alert訪問不到。是undefined。htm
首先結果的確是undefined。先說第二種狀況,所謂私有做用域通常都是寫在function裏面的,在這些判斷語句裏面有賦值操做,就要看這些判斷語句所處的做用域,這裏很明顯全局的。因此a不是私有變量。對象
下面能夠嘗試輸入如下代碼試試:
alert(「a」 in window); var a;
首先全部的全局變量均可以做爲window的屬性,window.a,因此能夠用上述方法查看a是否存在window中。上面的輸出是true,由於Js中全部的變量聲明都會在做用域的頂部(有點相似函數聲明的預編譯)。js引擎會首先搜索全部的變量聲明而後提到做用域的頂部,可是變量的賦值卻不會提早(若是是的話,能夠想像會發生不少不可預知的錯誤),var a=1;是等價於var a; a=1;的。
因此這道題,由於變量a會在做用域頂部存在window中,因此跳過賦值操做,輸出結果是undefined。
題目二:
function a(){ return 1; } var a; alert(typeof a); //"function"
這個題有點意思,上面說過函數聲明會提早,變量聲明也會提早,如今var a;要提早,function a也要提早。。。。。。到底誰會覆蓋誰呢?
function a(){ return 1; } var a; alert(typeof a); //"function"
很明顯上面上面中函數聲明會覆蓋變量聲明,優先級較高一點。可是改爲var a=1;以後結果倒是截然相反的。
function a(){ return 1; } var a =1; alert(typeof a); //「number」
題目二中有涉及,因此答案是function。。。。。。。。。。。。
題目四:
《深刻理解JavaScript系列(12):變量對象(Variable Object)》中的函數上下文中的變量對象一節就能夠清楚地知道,活動對象是在進入函數上下文時刻被建立的,它經過函數的arguments屬性初始化。arguments屬性的值是Arguments對象:
AO = { arguments: <ArgO> };
Arguments對象是活動對象的一個屬性,它包括以下屬性:
這個共享其實不是真正的共享一個內存地址,而是2個不一樣的內存地址,使用JavaScript引擎來保證2個值是隨時同樣的,固然這也有一個前提,那就是這個索引值要小於你傳入的參數個數,也就是說若是你只傳入2個參數,而還繼續使用arguments[2]賦值的話,就會不一致,例如:
function b(x, y, a) { arguments[2] = 10; alert(a); } b(1, 2);
這時候由於沒傳遞第三個參數a,因此賦值10之後,alert(a)的結果依然是undefined,而不是10,但以下代碼彈出的結果依然是10,由於和a沒有關係。
function b(x, y, a) { arguments[2] = 10; alert(arguments[2]); } b(1, 2);
題目五:
根據ECMAScript262規範規定:若是第一個參數傳入的對象調用者是null或者undefined的話,call方法將把全局對象(也就是window)做爲this的值。因此,無論你何時傳入null,其this都是全局對象window,因此該題目能夠理解成以下代碼:
function a() { alert(this); } a.call(window);
因此答案是object window。
題目六:
深度克隆,百度會有代碼的。