2016-11-11 52 views
1

局部变量,当我宣布在文件中的功能,使之成为全球不确定:功能变得声明具有相同名称

angular 
 
    .module('login', ['ngRoute']) 
 
    .factory('speakService', [function() { 
 
     var speakService = speakService(); 
 
     return speakService; 
 
    }]);

但只要解释打线:

var speakService = speakService();

的speakService() - 函数是不确定的。如果我改变speakService变量speakSvc这样它工作正常:

var speakSvc = speakService();

有人可以解释为什么具有相同名称声明一个局部变量时,我的整体功能是不确定的?

问候!

+0

你并不需要创建'speakService'函数内部命名变量。只需返回一个带有指定讲话功能的对象字面值。 – Jecoms

回答

3

该变量似乎未定义的原因是hoisting。当您编写var x = 3之类的东西时,x的定义被悬挂在当前范围的顶部(在这种情况下起作用,因为您使用的是var)。分配本身发生在你击中特定线路时。

因此,在您的具体情况下,当您输入该变量的作用域时,首先定义它var speakService,该作用域将隐藏函数speakService。然后尝试执行speakService = speakService()行,并且因为speakService只是未定义的未初始化变量。

+0

实际上,具有相同名称的变量的声明隐藏了全局变量。全局变量仍然可用,例如通过使用窗口对象的方式来实现。我只是测试了这一点。我不确定提升与此有什么关系。即使没有将变量声明移动到函数顶部,全局变量也会被隐藏 - 或者我错了吗? – user2145393

3

这是因为JavaScript的hoisting

function() { 
     var speakService = speakService(); 
     return speakService; 
    } 

将是相同

function() { 
     var speakService; //Declaration moved to top 
     speakService = speakService(); //here speakService is undefined 
     return speakService; 
    } 
1

像其他人说,你的问题是吊装。只需返回一个对象文字并使用IIFE模式。

var myService = (function speakService() { 
 
    var speak = function(word) { 
 
     console.log(word); 
 
    }; 
 
    
 
    return { 
 
     speak: speak 
 
    }; 
 
})(); 
 

 
myService.speak("TEST");

相关问题