十一国庆节 之 “变量与函数同名时,会输出谁?”

时间:2022-04-27
本文章向大家介绍十一国庆节 之 “变量与函数同名时,会输出谁?”,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

看这样一个题目:

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。

就这么简单。