1. 考察this
1這裡的坑主要是arguments,我們知道取物件屬於除了點操作符還可以用中括號,這裡fn的scope是arguments,即fn內的this===arguments,呼叫時僅傳了乙個引數fn,因此length為1。var length = 10
2function
fn()
5var obj =11}
12 obj.method(fn)
2. 函式表示式具名(函式宣告同時賦值給另乙個變數)或函式宣告立即執行時,名僅在該函式內可訪問
1 ~function外層匿名函式自執行,列印next,接著內層具名函式自執行。會發現具名的next僅在其自身函式體內可訪問,即輸出為function。外面是不可見的,typeof就為undefined了。(注:此題ie6/7/8中輸出為function function, 標準瀏覽器為undefined function)() ()
6 }()
同樣的情況也發生在將具名函式賦值給乙個變數時,如下:
1這條規則是標準中(es3/es5)都已明確指出,但ie6、7、8沒有嚴格遵從。可參見w3help的分析或李松峰老師的翻譯《命名函式表示式探秘》var func = function
a()
4 func() //
?5 alert(typeof a) //
?
3. 給基本型別資料新增屬性,不報錯,但取值時是undefined
1 a = 3變數a為數字3,給其新增prop屬性,值為4(奇怪吧在js中這是允許的,且不會有語法錯誤)。然後alert出a+a.prop的結果。結果是nan。a.prop為undefined,3+undefined為nan。2 a.prop = 4
3 alert(a + a.prop) //
?
舉一反三,給字串新增屬性:
1 str = 'a'結果呢?2 str.prop = 'b'
3 alert(str + str.prop) //
?
4. 隱式的全域性變數
1js中不用var宣告的變數預設是全域性變數,而這裡的連等使的情況更加隱蔽。這裡的b是全域性的,因此func外可以訪問。var a = 1
2function
func()
5func()
6alert(a)
7 alert(b) //
?
5. 變數宣告早於**執行(scoping and hoisting)
1這裡容易犯迷糊的是第乙個alert,如果認為函式change外已經宣告賦值了,此時應該是jack,實際函式內又var了一次(雖然var在其後),預解析時仍然會將其置undefined。這也是為什麼書裡都建議變數宣告都放在**塊的最前面。var uname = 'jack'
2function
change()
7 change()
6. 函式宣告早於變數宣告
1change內先alert出fn,後函式宣告,再變數宣告。如果fn沒有函式宣告而僅是變數宣告,那麼結果與5一樣是undefined。但這裡卻是function。即同乙個作用域內,函式宣告放在**塊後面和前面都沒有關係,函式可以正常使用。而變數宣告則需先置前,先使用則是undefined。function
change()
6varfn7
}8 change()
JS筆試題中的型別轉換
分享一道筆試題 let x valueof console.log x 20 console.log x 30 複製 答案是false true 為什麼?讓我們回到紅寶書中,對於相等描述符是這樣表述的 是相等操作符,如果兩個運算元相等,則返回true,而不相等操作符由嘆號後更等於號 表示,如果兩個運...
(常筆試 面試題)const的用途有哪些?
0.const關鍵字概述 1 const是constant的簡寫,只要乙個變數前面用const來修飾,就意味著該變數裡的資料可以被訪問,不能被修改。也就是說const意味著 唯讀 readonly。不能說const修飾的都是常量。2 修飾規則 const離誰近,誰就不能被修改 3 本質 const在...
一道錯過的很基礎的筆試題
目前只記得個大概了 乙個16位的作業系統 unsigned char a 4 3 a 當初自己寫的答案是3,但是真相卻不是這樣?第乙個自己考慮到了隱性強制型別轉換,第二個計算機是通過補碼的形式來表示資料的,不過當時還是算錯了!原碼就是二進位制定點表示法,即最高位為符號位,0 表示正,1 表示負,其餘...