当变量和函数具有相同名称时,引用是什么?

krt*_*yan 21 javascript

我有一个名为foo的变量和名为foo的函数.

//variable followed by function declaration
var foo="bar";
function foo(){
  return "bar";
}
//function declaration followed by variable
function foo(){
  return "bar";
}
var foo="bar";
//When I call foo it returns string bar;
//When I enquired foo() it throws error
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?为什么变量名覆盖函数声明?

Tus*_*har 15

当我调用foo它时返回字符串bar;

函数声明被提升到其范围的顶部.编译器将函数定义移到上面.然后变量被覆盖到字符串.

代码相当于

function foo() {
    return "bar";
}
// Overwriting the value
var foo = "bar"
Run Code Online (Sandbox Code Playgroud)

因此,在这两种情况下,输出都是'bar'.

请注意,函数表达式不会被挂起.

有关函数提升的更多信息,请参阅Javascript函数范围和提升

当我询问foo()它时undefined

foo这里不是函数,它是一个字符串.所以,foo()会抛出一个错误

未捕获的TypeError:a不是函数(...)