天天學習一點js

---- 有人會說js很簡單,很容易學,可是要想把這門語言用活,用精通仍是須要下很大的功夫的。那麼咱們就來看看接下來這幾道js面試題吧。node

題1面試

if(!(a in window)){
   var a  = 1;    
}
console.log(a);

在控制檯輸出的結果是 undefined,其實就是考察js中變量提高的知識點。瀏覽器

變量提高表示的是變量的聲明會被提早到函數頂部的地方,而賦值語句不會提高。所以上面的題目實際是等於以下代碼    函數

//變量提高this

var a;
if(!(a in window)){
     a = 1;      
}
console.log(a) 

 
變量a提高到頂部,第一句就至關於window.a = undefined,因此在if語句中,判斷條件始終是false,所以a=1不會執行,最終輸出undefined。code

題2對象

var a = 1,
        b = function(){
            x && a(--x);
        }    
console.log(a);

結果是1.ip

這道題考察的知識點是是具名函數表達式,聲名函數表達式是不攢在變量提高的,因此函數的定義不會被提早到頂部;並且聲名函數表達式的名字在外部訪問時會報錯,只能函數內部訪問到。咱們能夠看看下面的例子。內存

var b = function a () {}
b(); //調用正常
a();//typeError:a is not a function

題3io

function a(x){
    return x*2;
}
var a ;
console.log(typeof a);

結果爲 function

這道題目是的知識點是 函數聲明和變量聲明。 須要記住一點就是,在JavaScript中,函數聲明的優先級高於變量聲明的優先級。

所以在上述題中,因爲優先級的問題,a會被定義爲一個函數,後面定義的變量不會生效,所以typeof的時候會返回function。

可是,須要注意的是,雖然函數聲明會覆蓋變量聲明,但不會覆蓋變量的賦值,咱們將上面的代碼該下,就會發現這個特色。

function a(x){
  return x*2;
}
var a = 1;
console.log(typeof a);

上面的代碼會返回number。由於賦值語句a= 1不會被覆蓋,因此a會是一個數字,而不是函數,最終返回number。

題4

function b(x,y,a){
    arguments[2] = 10;
    console.log(a);  
}
b(1,2,3);

最終輸出的結果是10

可是,須要注意一種特殊狀況,那就是嚴格模式,在嚴格模式下,arguments對象實際是函數參數的一個拷貝,實際指向的是不一樣的內存空間,對arguments值的改變並不會影響到函數參數值。

因此在嚴格模式下輸出的是3

function a(){
   console.log(this);
}
a.call(null);

輸出的結果是window對象。

這道題目考察的call方法,在js中,若是給call方法傳遞的第一個參數爲null或者undefined,那麼call方法中this會指向全局對象。

在瀏覽器環境中,全局對象爲window;而在nodejs環境中全局對象爲global,所以上述代碼若是在瀏覽器下運行,會返回window。

相關文章
相關標籤/搜索