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

时间:2016-10-17 03:13:53

标签: 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

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

5 个答案:

答案 0 :(得分:15)

  

当我致电foo时,它会返回字符串bar;

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

代码等同于

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

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

请注意,function expressions未被提升。

有关功能提升的更多信息,请参阅Javascript function scoping and hoisting

  

当我查询foo()时,undefined

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

  

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

答案 1 :(得分:2)

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

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

输出是一个函数

和逆转:

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

输出“bar”。

答案 2 :(得分:1)

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

请注意,如果您声明您的功能

var foo = function() {}

实际上它在开始时没有被处理,也覆盖了事先声明的变量。

答案 3 :(得分:0)

var foo="bar";

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

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

答案 4 :(得分:0)

这两种情况都会返回字符串" bar"

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

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