我有这种情况
var fellowship = undefined;
fellowship = function(){
return "broken";
};
function fellowship(){
return "friends";
}
console.log(fellowship);
永远不会达到返回“朋友”的功能,即使我这样称呼它:
console.log(fellowship());
有人能解释一下如何调用这个函数吗?
答案 0 :(得分:4)
您的代码被解释为如下所示:
function fellowship(){
return "friends";
}
var fellowship = undefined;
fellowship = function(){
return "broken";
};
console.log(fellowship);
因此,名为“fellowship”的变量的声明会覆盖该符号与使用相同名称定义的函数的绑定。在那之后你不能打电话。
答案 1 :(得分:3)
"有谁能解释我如何调用这个函数?"
无法调用。你已经覆盖了它。单个标识符无法直接引用两个不同的值。
在同一范围内具有赋值表达式的争用中,函数声明将始终丢失。
答案 2 :(得分:1)
是的,可变升降和功能声明吊装的概念正在形成。 在您的示例中,您已声明
var fellowship = undefined;
已经位于顶部。 现在是下一个声明:
fellowship = function() {
return "broken";
}
是一个在javascript中没有提升的表达式。 第三个是功能声明,它在变量提升线上也被提升。 所以,现在你的结构就像:
var fellowship = undefined;
// function declaration hoisted
function fellowship(){
return "friends";
}
fellowship = function(){
return "broken";
};
所以,当你打电话给团契()时,它会返回'破坏'。
http://javascriptweblog.wordpress.com/2010/07/06/function-declarations-vs-function-expressions/ 这个链接应该对你有用
答案 3 :(得分:0)
在JavaScript中,函数定义被提升到当前范围的顶部。因此,您的示例代码如下:
var fellowship= function() { return 'friends' };
var fellowship= function() { return 'broken' };
如果您想了解此信息,请点击此链接: http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html