当一个变量和函数同名时,引用将是什么

What will the reference be when a variable and function have the same name?

本文关键字:引用 是什么 函数 变量 一个      更新时间:2023-09-26

我有一个名为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时,它返回字符串bar

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

代码等同于

function foo() {
    return "bar";
}
// Overwriting the value
var foo = "bar"

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

请注意,函数表达式不会被提升。

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

当我询问foo()时,它是undefined

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

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

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

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

输出是一个函数

以及反转:

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

输出为"bar"。

在JavaScript中,函数在进入相应范围时进行处理。当解释器到达变量的声明时,将处理这些变量。因此,在您的示例中,首先处理函数,最后一个函数使用名称foo,然后由变量覆盖。

注意,如果你像这个一样声明你的函数

var foo = function() {}

它实际上在一开始并没有被处理,而且还覆盖了预先声明的变量。

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

他们是一样的。不要错过把;放在行的末尾。

两种情况都将返回字符串"bar">

基本上,javascript抓取所有函数并将它们放在文件的顶部它被称为吊装。

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