笔试题之坑
1.变量声明早于代码运行(Scoping and Hoisting)
var uname = 'jack' function change() { alert(uname) // ? var uname = 'lily' alert(uname) } change()
执行结果:undefined lily
这里容易犯迷糊的是第一个alert,如果认为函数change外已经声明赋值了,此时应该是jack,实际函数内又var了一次(虽然var在其后),预解析时仍然会将其置undefined。这也是为什么书里都建议变量声明都放在代码块的最前面。
2.函数表达式具名(函数声明同时赋值给另一个变量)或函数声明立即执行时,名仅在该函数内可访问
~function() {
alert(typeof next) // ?
~function next() {
alert(typeof next) // ?
}()
}()
执行结果:undefined function
外层匿名函数自执行,打印next的类型,接着内层具名函数自执行。会发现具名的next仅在其自身函数体内可访问,即输出为function。外面是不可见的,typeof就为undefined了。(注:此题IE6/7/8中输出为function function, 标准浏览器为undefined function)
同样的情况也发生在将具名函数赋值给一个变量时,如下
var func = function a() { alert(typeof a) } func() // function alert(typeof a) // number ??????
3.数声明早于变量声明
function change() { alert(typeof fn) // function function fn() { alert('hello') } var fn } change()
change内先alert出fn,后函数声明,再变量声明。如果fn没有函数声明而仅是变量声明,那么结果是undefined。但这里却是function。
即同一个作用域内,函数声明放在代码块后面和前面都没有关系,函数可以正常使用。而变量声明则需先置前,先使用则是undefined。
努力没有早晚,耕耘就有收获