声明具有相同名称的局部变量时,函数变为未定义

时间:2016-11-11 18:39:51

标签: javascript variables scope

我在文件中声明了一个函数,使其变为全局函数:



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();




在声明具有相同名称的局部变量时,有人可以解释为什么我的全局函数未定义吗?

问候!

3 个答案:

答案 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");