从外部定义的函数访问作用域中的变量

Access to variables in scope from a function defined externally

本文关键字:变量 作用域 函数 定义 从外部 访问      更新时间:2023-09-26

有没有一种方法可以从闭包外定义但在闭包内引用的函数中打印temp(闭包变量)的值,而不将temp作为变量传递给funcA?

var funcA, funcB;
funcA = function () {
   console.log(temp);
}
funcB = function () {var temp, funcC;
  temp = 1;
  funcC = funcA;
  funcC();
}
funcB();  // temp is undefined.

这是有效的,但只是因为funcA是在funcB:中定义的

funcB = function () {var temp, funcA, funcC;
  temp = 1;
  funcA = function () {
       console.log(temp);
  }
  funcC = funcA;
  funcC();
}
funcB(); // 1

我正试图找到一种方法,从外部函数中提取一些函数定义,以简化变得有点复杂的代码。我可以在funcB之外定义funcA,但仍然引用临时变量而不必传递参数吗?

我读到javascript没有动态运行时作用域,它只是词法作用域,但通过引用funcB中的函数(funcAvia funcC),是否有方法满足词法作用域要求并为funcB提供对作用域变量的访问?

利用Akinkunle Allen的评论,我想出了这个似乎解决了我的问题。

function funcB () {
  var funcA, funcB, temp;
  funcA = function () {
     console.log(temp);
  }
  funcB = function () {var funcC;
    temp = 1;
    funcC = funcA;
    funcC(); 
  }
  return funcB();
}
funcB(); // 1

是,不。

声明变量的关键字var根据当前作用域的不同而不同。在全局作用域上执行var时,它是可选的。该变量成为全局对象的一个属性。在浏览器中执行时,此全局对象为window

因此,以下在全球空间中的结果是相同的。

var temp = 1;
window.temp = 1;
this.temp = 1;

由于全局上下文的原因,以上所有内容都只是window.temp

当您在函数内部使用var时,变量被附加到函数。Javascript中的所有函数都是对象,因此只要父函数仍在某个地方使用,本地var变量就会一直存在。

Javascript将遍历执行作用域的层次结构,以找到变量标识符。因此,任何内部函数都可以访问其外部函数变量(如您的示例所示)。

您可以在函数中使用this引用。

Javascript中的标识符this是动态的(意味着您可以更改它)。我可以将一个变量传递给在调用函数外部声明的未知函数。由于this.temp用于引用变量,因此函数funcA能够显示该值。

funcB = function(otherFunc)
{
    this.temp = 1;
    otherFunc();
}
funcA = function()
{
    alert(this.temp);
}
funcB(funcA);

http://jsfiddle.net/thinkingmedia/dfLvj/

请参阅上面的jsfiddle示例。

你能做的就是随时改变this的含义。这里有一个更好的例子。

funcB = function(otherFunc)
{
    var temp = {
        message: "Hello World!"
    };
    var foo = otherFunc.bind(temp);
    foo();
}
funcA = function()
{
    alert(this.message);
}
funcB(funcA);

http://jsfiddle.net/thinkingmedia/K5Pw6/

通过允许函数接受将使用自定义this引用执行的闭包引用,动态更改this可以带来很多好处。

一个例子可能是单击事件处理程序,其中this是触发事件的DOM元素。