javascript - 从全局定义的函数访问函数作用域链

标签 javascript closures scope

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

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

globalFunc2();

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

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。然而,它本身是一个全局变量,允许从外部访问它。

就您提出问题的方式而言,当(且仅当)该全局定义的(也许应该说“声明”)函数指向一个函数<时,您可以“从全局定义的函数访问函数作用域链” strong>在其他函数的范围内。

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

关于javascript - 从全局定义的函数访问函数作用域链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26882305/

相关文章:

Javascript:逗号运算符、var 和作用域 - 为什么它会这样工作?

sql - 计数子项的范围 has_many 关系

javascript - jQuery (window).load 页面加载后?

javascript - 分页 "Prev"和 "Next"错误

javascript - 当用户单击react-router-dom上的后退按钮时如何更改组件的状态?

javascript 闭包和函数放置

Python列表理解覆盖值

javascript - 正则表达式匹配大括号

javascript - 具有相同功能的多个事件监听器存储单独的局部变量?

javascript - 尝试保持输入参数不变