Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当声明具有相同名称的局部变量时,函数将变得未定义_Javascript_Variables_Scope - Fatal编程技术网

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

Javascript 当声明具有相同名称的局部变量时,函数将变得未定义,javascript,variables,scope,Javascript,Variables,Scope,我在文件中声明了一个函数,使其成为全局函数: 函数speakService(){ var speakService={}; var speak=函数(单词){ console.log(word); }; speakService.speak=speak; 返回语音服务; }变量未定义的原因是。当您编写类似于var x=3的内容时,x的定义将被提升到当前范围的顶部(在本例中,由于您使用的是var,因此该定义起作用)。当你点击那一行时,作业本身就发生了 因此,在您的特定情况下,当您输入该变量的作用

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

函数speakService(){
var speakService={};
var speak=函数(单词){
console.log(word);
};
speakService.speak=speak;
返回语音服务;

}
变量未定义的原因是。当您编写类似于
var x=3
的内容时,
x
的定义将被提升到当前范围的顶部(在本例中,由于您使用的是
var
,因此该定义起作用)。当你点击那一行时,作业本身就发生了


因此,在您的特定情况下,当您输入该变量的作用域时,首先定义它
var speakService
,这将隐藏作用域其余部分的函数
speakService
。然后您尝试执行行
speakService=speakService()
,因为
speakService
只是一个未初始化的变量,所以您得到了未定义的变量

变量未定义的原因是。当您编写类似于
var x=3
的内容时,
x
的定义将被提升到当前范围的顶部(在本例中,由于您使用的是
var
,因此该定义起作用)。当你点击那一行时,作业本身就发生了


因此,在您的特定情况下,当您输入该变量的作用域时,首先定义它
var speakService
,这将隐藏作用域其余部分的函数
speakService
。然后您尝试执行行
speakService=speakService()
,因为
speakService
只是一个未初始化的变量,所以您得到了未定义的变量

这是因为javascript的

将与

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

这是因为javascript的

将与

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

正如其他人所说,你的问题是提升。只需返回一个对象文本并使用该模式

var myService=(函数speakService(){
var speak=函数(单词){
console.log(word);
};
返回{
说:说
};
})();

myService.speak(“测试”)正如其他人所说,您的问题是提升。只需返回一个对象文本并使用该模式

var myService=(函数speakService(){
var speak=函数(单词){
console.log(word);
};
返回{
说:说
};
})();

myService.speak(“测试”)
您不需要在
speakService
函数中创建命名变量。只需返回一个带有指定speak函数的对象文本。您不需要在
speakService
函数中创建命名变量。只需返回一个带有指定speak函数的对象文本。事实上,具有相同名称的变量的声明隐藏了全局变量。全局变量仍然可用,例如,通过使用windows对象对其进行引用。我刚刚测试过这个。我不知道这跟吊装有什么关系。即使不将变量声明移到函数顶部,全局变量也会被隐藏——或者我错了吗?事实上,使用相同名称的变量声明会隐藏全局变量。全局变量仍然可用,例如,通过使用windows对象对其进行引用。我刚刚测试过这个。我不知道这跟吊装有什么关系。即使不将变量声明移到函数顶部,全局变量也会被隐藏——或者我错了?