蠻考驗基礎的JS筆試題(有坑當心!)

1.  考察thishtml

 1 var length = 10
 2 function fn(){  3     alert(this.length)  4 }  5 var obj = {  6     length: 5,  7     method: function(fn) {  8         fn() // ?
 9         arguments[0]() // ?
10  } 11 } 12 obj.method(fn)

這裏的坑主要是arguments,咱們知道取對象屬於除了點操做符還能夠用中括號,這裏fn的scope是arguments,即fn內的this===arguments,調用時僅傳了一個參數fn,所以length爲1。express

 

2. 函數表達式具名(函數聲明同時賦值給另外一個變量)或函數聲明當即執行時,名僅在該函數內可訪問瀏覽器

1 ~function() { 2     alert(typeof next) // ?
3     ~function next() { 4         alert(typeof next) // ?
5  }() 6 }()

外層匿名函數自執行,打印next,接着內層具名函數自執行。會發現具名的next僅在其自身函數體內可訪問,即輸出爲function。外面是不可見的,typeof就爲undefined了。(注:此題IE6/7/8中輸出爲function function, 標準瀏覽器爲undefined function函數

一樣的狀況也發生在將具名函數賦值給一個變量時,以下:this

1 var func = function a() { 2     alert(typeof a) 3 } 4 func() // ?
5 alert(typeof a) // ?

這條規則是標準中(ES3/ES5)都已明確指出,但IE六、七、8沒有嚴格聽從。可參見w3help的分析或李鬆峯老師的翻譯《命名函數表達式探祕spa

 

3. 給基本類型數據添加屬性,不報錯,但取值時是undefined翻譯

1 a = 3
2 a.prop = 4
3 alert(a + a.prop) // ?

變量a爲數字3,給其添加prop屬性,值爲4(奇怪吧在JS中這是容許的,且不會有語法錯誤)。而後alert出a+a.prop的結果。結果是NaN。a.prop爲undefined,3+undefined爲NAN。code

觸類旁通,給字符串添加屬性:htm

1 str = 'a'
2 str.prop = 'b'
3 alert(str + str.prop) // ?

結果呢?對象

 

4. 隱式的全局變量

1 var a = 1
2 function func() { 3     a = b = 2
4 } 5 func() 6 alert(a) 7 alert(b) // ?

 JS中不用var聲明的變量默認是全局變量,而這裏的連等使的狀況更加隱蔽。這裏的b是全局的,所以func外能夠訪問。

 

5. 變量聲明早於代碼運行(Scoping and Hoisting

1 var uname = 'jack'
2 function change() { 3     alert(uname) // ?
4     var uname = 'lily'
5  alert(uname) 6 } 7 change()

這裏容易犯迷糊的是第一個alert,若是認爲函數change外已經聲明賦值了,此時應該是jack,實際函數內又var了一次(雖然var在其後),預解析時仍然會將其置undefined。這也是爲何書裏都建議變量聲明都放在代碼塊的最前面。

 

6. 函數聲明早於變量聲明

1 function change() { 2     alert(typeof fn) // ?
3     function fn() { 4         alert('hello') 5  } 6     var fn 7 } 8 change()

 

change內先alert出fn,後函數聲明,再變量聲明。若是fn沒有函數聲明而僅是變量聲明,那麼結果與5同樣是undefined。但這裏倒是function。即同一個做用域內,函數聲明放在代碼塊後面和前面都沒有關係,函數能夠正常使用。而變量聲明則需先置前,先使用則是undefined。

相關文章
相關標籤/搜索