Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/382.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_Closures_Scope - Fatal编程技术网

Javascript 从全局定义的函数访问函数范围链

Javascript 从全局定义的函数访问函数范围链,javascript,closures,scope,Javascript,Closures,Scope,如果不将内部变量传递给globalFunc1(),这是否可能? 我目前正在使用下面的黑客来实现我想要的,但它太黑客和不雅的方式 function globalFunc1() { console.log(hello); } function globalFunc2() { var hello = 'hello'; globalFunc1(); // expected to print "hello" but `hello` is undefined instead } global

如果不将内部变量传递给
globalFunc1()
,这是否可能? 我目前正在使用下面的黑客来实现我想要的,但它太黑客和不雅的方式

function globalFunc1() {
  console.log(hello);
}

function globalFunc2() {
  var hello = 'hello';
  globalFunc1(); // expected to print "hello" but `hello` is undefined instead
}

globalFunc2();
编辑:

实际上,我正在从Javascript中寻找一些类似于
Function.prototype.bind
.call
.apply
的功能,以实现我想要的功能

要详细说明我在做什么:

function globalFunc2() {
  var hello = 'hello';
  eval('(' + globalFunc1.toString() + ')()');
}

您可以将
globalFunc1
移动到
globalFunc2
内部,这样它就可以访问后者的内部变量,但可以将其分配给全局变量以允许从外部调用它:

function checker() {
  if (someVar == 'some value') { 
    /* ... */
  }
}

setTimeout(function() {
  var someVar = 'some value';
  /* ... */
  checker();
}, 1000);
在这里,
globalFunc1
是在
globalFunc2
中定义的,因此可以访问其闭包中的变量,在本例中为
hello
。但是,它本身是一个全局变量,允许从外部访问它

就您如何提问而言,如果(且仅当)全局定义的(也许应该说“声明的”)函数指向另一个函数范围内的函数,您可以“从全局定义的函数访问函数范围链”


无论你做什么,都不要做你的
eval
事情。实际上,您在那里做的是定义(然后立即执行)函数,方法是在中按词汇复制函数。与其这样做,为什么不在那里开始编写函数,如上所述?

不,不可能为您的输入确认!由于
globalFunc2
是一种回调函数,将执行多次,因此我不想多次定义同一函数(即:
globalFunc1
)。不过,我暂时会采用你的方法。(问题已作相应更新)
function globalFunc2() {

  window.globalFunc1 = function() {
    console.log(hello);
  };

  var hello = 'hello';
  globalFunc1(); // will print "hello"
}

globalFunc1(); // will print "hello"