Javascript 当变量和函数同名时,引用是什么?

Javascript 当变量和函数同名时,引用是什么?,javascript,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;

我有一个名为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
这里发生了什么?为什么变量名会覆盖函数声明

当我调用
foo
时,它返回string
bar

函数声明位于其作用域的顶部。编译器会将函数定义移到上面。然后变量被覆盖为字符串

代码等同于

function foo() {
    return "bar";
}
// Overwriting the value
var foo = "bar"
因此,在这两种情况下,输出都是
'bar'

请注意,未吊运

有关功能提升的更多信息,请参阅

当我询问
foo()
时,它是
未定义的

foo
这里不是函数,而是字符串。因此,
foo()
将抛出一个错误

未捕获类型错误:a不是函数(…)


它们是一样的。不要错过放
在行尾。

在JavaScript中,函数在进入相应的作用域时被处理。 当解释器到达它们的声明时,变量被处理。 因此,在您的示例中,首先处理函数,最后一个函数使用名称
foo
,然后被变量覆盖

注意,如果您这样声明函数

var foo = function() {}

它实际上不是在开始时处理的,并且也覆盖了预先声明的变量。

这两种情况都将返回字符串“bar”

基本上,javascript获取所有函数并将它们放在文件的顶部 这叫吊装


因此,字符串声明将在这两种情况下覆盖函数表达式

以更清晰、更明确的方式声明变量,后者将考虑:

    var foo = "bar";
    var foo = function () {
        return "bar";
    };
    console.log(foo);
输出是一个函数

与此相反:

var foo = function () {
    return "bar";
};
var foo = "bar";
console.log(foo);

将“bar”作为输出。

两种情况都将返回字符串“bar”。基本上,函数被提升到文件的顶部。因此,字符串“bar”将在这两种情况下替换它们。-它不应该返回undefined,它应该引发一个错误。@Tushkar它确实引发了一个错误,这是我的错误,声明foo undefined。不管怎样,谢谢你的回答。恐怕你没有回答这个问题,而且遗漏了
不会改变任何东西。
var foo = function () {
    return "bar";
};
var foo = "bar";
console.log(foo);