使用功能订单提升

时间:2015-01-05 17:07:58

标签: javascript

我有这种情况

var fellowship = undefined;

fellowship = function(){
    return "broken";
  };

 function fellowship(){
    return "friends";
 }

console.log(fellowship);

永远不会达到返回“朋友”的功能,即使我这样称呼它:

console.log(fellowship());

有人能解释一下如何调用这个函数吗?

4 个答案:

答案 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