Javascript nodejs变量仅在函数和子函数中
我试图一次多次运行同一个函数,但如果使用Javascript nodejs变量仅在函数和子函数中,javascript,node.js,variables,scope,Javascript,Node.js,Variables,Scope,我试图一次多次运行同一个函数,但如果使用var variablename创建一个本地函数,子函数将无法识别它。如果我将其设置为全局,函数的所有实例都将覆盖它 function vladimir(){ var test="hello"; hanspeter(); } function hanspeter(){ console.log(test); } console.log输出未定义。使用函数参数: function vladimir(){ var test="hello"; h
var variablename
创建一个本地函数,子函数将无法识别它。如果我将其设置为全局,函数的所有实例都将覆盖它
function vladimir(){
var test="hello";
hanspeter();
}
function hanspeter(){
console.log(test);
}
console.log输出未定义。使用函数参数:
function vladimir(){
var test="hello";
hanspeter(test);
}
function hanspeter(arg){
console.log(arg);
}
您在这里遇到了范围界定问题
当您在不使用var(
function(){}
)的情况下声明方法时,这些函数声明将移动到本地范围的顶部(如果您想查找它,称为函数提升)
如果手动声明函数,则必须等到它们都被声明后才能使用它们。这是因为第一个函数不知道在它下面声明的任何函数
您还遇到了一个问题,变量的作用域没有被限定。如果您在一个函数中声明了一个变量,则不能保证它在另一个函数中(因为它是不同的作用域)
如果要传递这些变量,最简单的方法是将它们传递到函数参数中,这将在其他函数中实现
因此,在您的简单示例中,您可以让它像这样工作:
var hanspeter = function (test) {
console.log(test);
}
var vladimir = function() {
hanspeter( "hello" );
}
JavaScript使用词法作用域-看起来您需要动态作用域。本质上,这意味着函数可以根据其声明的位置而不是调用的位置来访问变量。例如,以下方法可行:
function vladimir(){
var test="hello";
function hanspeter(){
console.log(test);
}
hanspeter();
}
因为test
存在于声明hanspeter
的地方。但是在您的中,test
存在于调用hanspeter
的地方,它不允许它访问
您还可以通过传递变量来获取变量:
function vladimir(){
var test="hello";
hanspeter(test);
}
function hanspeter(test2){
console.log(test2);
}
我将参数调用到
hanspeter
test2
,以表明重要的是参数的名称,而不是传递的变量的名称。hanspeter()
不会因为从vladimir()
调用它而成为子函数。你需要在vladimir()
@techfoobar中定义它。公平地说,他的期望描述了动态作用域,这在一些(大部分是旧的)语言中使用——APL、旧的Lisp等。“那些函数声明被移到了文件的顶部”——这不是真的;它们被移到范围的顶部,这是一个重要的区别。这也与问题无关;发布的代码不受函数提升的影响-如果函数声明为var hanspeter=function(){…}
@AaronDufour您是对的,范围的顶部,这是我的错误,那么它的行为将是相同的。我估计他在用他的语句声明他的函数时遇到了问题:“我试图一次多次运行同一个函数,但如果我创建一个带有var variablename的本地函数,子函数将无法识别它。如果我将其设为全局函数,函数的所有实例都将覆盖它。”可能是错误的,我只是想对可能出现的问题做一点概述。