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

Access function scope chain from a globally defined function

本文关键字:函数 访问 范围 全局 定义      更新时间:2023-09-26
function globalFunc1() {
  console.log(hello);
}
function globalFunc2() {
  var hello = 'hello';
  globalFunc1(); // expected to print "hello" but `hello` is undefined instead
}
globalFunc2();

如果不将内部变量传递给globalFunc1(),这是否可行?我目前正在使用以下技巧来实现我想要的,但它太黑客化和不优雅了。

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

编辑:

我实际上正在寻找Javascript的一些类似于Function.prototype.bind.call.apply的功能来实现我想做的事情。

详细说明我在做什么:

function checker() {
  if (someVar == 'some value') { 
    /* ... */
  }
}
setTimeout(function() {
  var someVar = 'some value';
  /* ... */
  checker();
}, 1000);

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

function globalFunc2() {
  window.globalFunc1 = function() {
    console.log(hello);
  };
  var hello = 'hello';
  globalFunc1(); // will print "hello"
}
globalFunc1(); // will print "hello"

在这里,globalFunc1是在globalFunc2内部定义的,因此可以访问其闭包中的变量,在这种情况下hello。但是,它本身是一个全局变量,允许从外部访问它。

就您提出问题的方式而言,当(并且仅当(该全局定义的(也许应该说"声明"(函数指向另一个函数作用域内的函数时,您可以"从全局定义的函数访问函数范围链"。

无论你做什么,都不要做你eval事。你在那里做的本质上是通过词法复制来定义(然后立即执行(函数。与其这样做,为什么不像上面那样在那里编写函数呢?