笔试题之坑

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。

posted @ 2016-04-23 18:09  蝴蝶女郎  阅读(185)  评论(0)    收藏  举报