我在文件中声明了一个函数,使其变为全局函数:
function speakService() {
var speakService = {};
var speak = function(word) {
console.log(word);
};
speakService.speak = speak;
return speakService;
}

使用AngularJS,我想将此服务添加为依赖项:
angular
.module('login', ['ngRoute'])
.factory('speakService', [function() {
var speakService = speakService();
return speakService;
}]);

但是一旦口译员遇到这条线:
var speakService = speakService();

speakService() - 函数未定义。如果我将speakService变量更改为speakSvc,它可以正常工作:
var speakSvc = speakService();

在声明具有相同名称的局部变量时,有人可以解释为什么我的全局函数未定义吗?
问候!
答案 0 :(得分:3)
变量似乎未定义的原因是hoisting。当您编写var x = 3
之类的内容时,x
的定义将被提升到当前范围的顶部(在这种情况下,由于您使用的是var
)。当您点击该特定行时,分配本身就会发生。
因此,在您的特定情况下,当您输入该变量的范围时,首先将其定义为var speakService
,这将从范围的其余部分隐藏函数speakService
。然后你尝试执行第speakService = speakService()
行,因为speakService
只是一个未初始化的变量,你得到了未定义。
答案 1 :(得分:3)
这是因为javascript' hoisting
function() {
var speakService = speakService();
return speakService;
}
与
相同function() {
var speakService; //Declaration moved to top
speakService = speakService(); //here speakService is undefined
return speakService;
}
答案 2 :(得分:1)
正如其他人所说,你的问题正在悬而未决。只需返回一个对象文字并使用IIFE模式。
var myService = (function speakService() {
var speak = function(word) {
console.log(word);
};
return {
speak: speak
};
})();
myService.speak("TEST");