2016-11-18 164 views
-2

我有以下代码:JavaScript变量名称相同的使用功能名称

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

var a; 
alert(a); 

为什么警报显示

function a(x) { 
    return x * 2 
} 

????如果我把var a = 4,警报显示4 但是像这样a将被识别为函数

为什么会发生这种情况?

+1

你期望什么?变量和函数在JavaScript中共享相同的名称空间,因此它们互相覆盖。 – Sirko

+0

@Sirko我希望a未定义 – joesid

+0

如果函数名称和变量名称相同,那么JS引擎将忽略该变量。 –

回答

4

功能是类型对象这是一种

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

函数声明:

  • 创建名为函数
  • 创建与相同名称的功能的当前范围的变量(除非这样的变量已经存在)
  • 分配功能
  • 已悬挂

一个var声明:

  • 创建与指定名称的电流范围变量(除非该变量已经存在)
  • 悬挂
  • 不赋值给变量(除非与转让运营商合并)

您的声明和var声明均被吊销。其中只有一个为变量a赋值。

2

如果使用函数名称作为变量名称,则其值由函数体替换。所以“var a”变成你的功能“a”,因此你的警报显示功能“a”。

3

在JavaScript两者函数声明变量声明被提升到函数的顶部,如果在功能或全局上下文的顶部限定,如果函数之外。函数声明优先于变量声明(但不能超过变量赋值)。

函数声明覆盖变量声明升起时

首先声明一个变量:

var a; // value of a is undefined 

二,a的值是一个函数,因为函数声明优先于变量声明(但不在变量分配中):

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

这就是你在拨打alert(a);时所得到的结果。

但是,如果不是声明变量,而是进行变量赋值:var a = 4;比赋值4优先。

+0

功能声明也被提起。 – Quentin

+0

是@Quentin,但表达式不是或名称表达式 – akinjide

+0

是@Quentin:函数声明和变量声明都被提升到包含范围的顶部。函数声明优先于变量声明(但不能超过变量赋值)。 –

1

你应该还记得var a悬挂,这使得它更喜欢这个

var a; // placed 

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

var a; // removed 
alert (a); // a is replaced by function body 

记住var a悬挂,因此,如果您分配4 to a

var a; // placed 

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

var a = 4; // removed 
a = 4 // added 

alert (a); // a is now 4