我有一个名为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
这里发生了什么?为什么变量名覆盖函数声明?
答案 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抓取所有函数并将它们放在文件的顶部 它被称为吊装。
因此字符串声明将覆盖两种情况下的函数表达式;