坑爹的JS筆試題(持續更新)


1,考察this

var length = 10
function fn(){
	alert(this.length)
}
var obj = {
	length: 5,
	method: function(fn) {
		fn() // ?
		arguments[0]() // ?
	}
}
obj.method(fn)

這里的坑主要是arguments,我們知道取對象屬於除了點操作符還可以用中括號,這里fn的scope是arguments,即fn內的this===arguments,調用時僅傳了一個參數fn,因此length為1。

 

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

~function() {
	alert(typeof next) // ?
	~function next() {
		alert(typeof next) // ?
	}()
}()

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

同樣的情況也發生在將具名函數賦值給一個變量時,如下

var func = function a() {
	alert(typeof a)
}
func() // ?
alert(typeof a) // ?

這條規則是標准中(ES3/ES5)都已明確指出,但IE6、7、8沒有嚴格遵從。可參見w3help的分析或李松峰老師的翻譯《命名函數表達式探秘

 

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

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

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

舉一反三,給字符串添加屬性

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

結果呢?

 

4,隱式的全局變量

var a = 1
function func() {
	a = b = 2
}
func()
alert(a)
alert(b) // ?

 JS中不用var聲明的變量默認是全局變量,而這里的連等使的情況更加隱蔽。這里的b是全局的,因此func外可以訪問。

 

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

var uname = 'jack'
function change() {
	alert(uname) // ?
	var uname = 'lily'
	alert(uname)
}
change()

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

 

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

function change() {
	alert(typeof fn) // ?
	function fn() {
		alert('hello')
	}
	var fn
}
change()

change內先alert出fn,后函數聲明,再變量聲明。如果fn沒有函數聲明而僅是變量聲明,那么結果與5一樣是undefined。但這里卻是function。即同一個作用域內,函數聲明放在代碼塊后面和前面都沒有關系,函數可以正常使用。而變量聲明則需先置前,先使用則是undefined。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM