从外部定义的函数访问范围中的变量

时间:2014-04-15 00:16:21

标签: javascript

有没有办法从闭包外定义的函数打印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但仍然引用temp变量而不必传递参数吗?

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

2 个答案:

答案 0 :(得分:1)

使用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

答案 1 :(得分: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元素。