看这样一个题目:
b = function c() {
a = 1, b = 2, c = 3;
console.log(a); //1
console.log(b); //2
console.log(c); //fuction c(){...
};
b();
它的结果是什么?你想想再回答,这次我又答对了
答案是,
1,
2,
function c(){....
为什么是这样呢?其实也很简单,首先明确以下几个事实:
1、function之外的b是函数,function之内的b是一个全局变量;
2、js的变量和函数声明都会被保存到上下文对象中,也就是AO对象之中;
3、函数声明的优先级,高于,变量声明,但并不会覆盖它;
看下面这个demo:
var xx = function axx(){
console.log('1:'+typeof axx)
}
console.log('2:'+typeof axx)
xx();
输出是多少?
var xx = function axx(){...,这是一个命名表达式,但它的名字axx,只是在它所定义的作用域范围之内才是有效的。
所以回到最开始时的那个题目,b是一个没有使用var声明的变量,它的值是一个函数,这个函数的标识符,也就是函数名是c,所以它在自己的作用域之内是可以访问的,并且因为c是函数标识,所以同名的变量名c,不能覆盖同名的函数名c。
就这么简单。