当JavaScript变量名称和函数名称相同时会发生什么?

joe*_*sid 20 javascript scope function hoisting name-binding

我有以下代码,我在其中声明一个函数,然后是一个与函数同名的变量:

function a(x) {
    return x * 2;
}

var a;
alert(a);
Run Code Online (Sandbox Code Playgroud)

我希望这能提醒undefined,但如果我运行它,警报将显示以下内容:

函数a(x){
    return x*2
}

如果我为变量赋值(如var a = 4),则警报将显示该值(4),但如果没有此更改,a则会将其识别为函数.

为什么会这样?

Que*_*tin 19

函数是一种对象类型,它是一种.

值可以存储在变量(和属性中,并作为参数传递给函数等).

功能声明:

  • 创建一个命名函数
  • 在当前作用域中创建一个与函数同名的变量(除非已存在这样的变量)
  • 将函数分配给该变量
  • 被悬挂

一个var语句:

  • 使用指定的名称在当前作用域中创建变量(除非此类变量已存在)
  • 被悬挂
  • 不为该变量赋值(除非与赋值运算符结合使用)

您的声明和var声明均已悬挂.只有其中一个为变量赋值a.


Yos*_*ero 8

在JavaScript中,函数声明变量声明都被提升到函数的顶部(如果在函数中定义),或者全局上下文的顶部(如果在函数外部).函数声明优先于变量声明(但不是变量赋值).

功能声明在提升时覆盖变量声明

首先声明一个变量:

var a; // value of a is undefined 
Run Code Online (Sandbox Code Playgroud)

其次,值a是一个函数,因为函数声明优先于变量声明(但不是变量赋值):

function a(x) {
  return x * 2;
}
Run Code Online (Sandbox Code Playgroud)

这就是你打电话时得到的alert(a);.

但是,如果不是声明变量而是进行变量赋值:var a = 4;那么指定的值4将占优势.