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

时间:2014-11-12 08:25:00

标签: 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和illlegant。

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);

1 个答案:

答案 0 :(得分:2)

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

function globalFunc2() {

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

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

globalFunc1(); // will print "hello"

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

就您提出问题的方式而言,您可以从全局定义的函数中访问函数范围链。 if(且仅限于)全局定义(可能应该说"声明"相反)函数指向另一个函数范围内的函数

无论你做什么,都不要做eval事。你实际上在做什么是通过词法复制它来定义(然后立即执行)该函数。而不是这样做,为什么不在那里开始编写函数,如上所述?