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的本地函数,子函数将无法识别它。如果我将其设为全局函数,函数的所有实例都将覆盖它。”可能是错误的,我只是想对可能出现的问题做一点概述。