Javascript 将作用域从一个函数传递到另一个函数

Javascript 将作用域从一个函数传递到另一个函数,javascript,scope,Javascript,Scope,我有一个对象litrel,它定义了两个匿名函数: obj = { funcA : function(){ var a = 'a'; }, funcB : function(){ // but how do you access the scope in 'funcA' to access variable 'a'? console.log(a) } } 我不想传递任何变量,只传递“funcA”-thinks?的作用

我有一个对象litrel,它定义了两个匿名函数:

obj = {
    funcA : function(){
        var a = 'a';
    },
    funcB : function(){
        // but how do you access the scope in 'funcA' to access variable 'a'?
        console.log(a)
    }
}

我不想传递任何变量,只传递“funcA”-thinks?的作用域。

JavaScript作用域不是这样工作的,因为它(只有)函数作用域(使用关键字时除外)

你能做的是


.

您可以使用模块模式的a闭包来访问外部作用域中的变量。多个函数可以访问变量:

var obj = (function() {

  var a;

  return {

    setA: function(value) {
      a = value;
      return a;
    },

    getA: function(value) {
      return a;
    },

    multiplyA: function(value) {
      a = a * value;
      return a;
    }
  };
}());


alert(    obj.setA(5)      );  // 5
alert(    obj.multiplyA(2) );  // 10
alert(    obj.getA()       );  // 10

参见道格拉斯·克罗克福德的文章。通过这种方式,函数可以在其作用域链上共享一个公共变量对象。您仍然无法引用它或将其传递给另一个函数,但您可能能够获得所需的功能。

此代码是否满足您的需要?如果没有,我真的很好奇为什么

obj = {
    funcA : function(){
        this.a = 'a';
        alert(this.a);
    },
    funcB : function(){
        // but how do you access the scope in 'funcA' to access variable 'a'?
        alert(this.a);
    }
}

obj.funcA();
obj.funcB();
访问单独函数的实际作用域与在父对象上设置成员有什么区别


此外,由于没有传递作用域的方法,您是否打算使用类似于此代码的代码?

您不能。你最初的问题是什么?你为什么需要这个范围转移?就像Max说的-你不能。变量
a
是funcA作用域的局部变量,作用域是不可“转移”的。Richard Cornford关于如何创建作用域链的文章中有一篇很好的文章。您不能引用激活或变量对象,因此您不能将“作用域”从一个函数传递到另一个函数。@RobG当变量对象是全局对象时,您可以访问它,对吗?与中一样,全局代码中的变量对象是
window
?@Alex-touché,全局对象是一个特例。使用with可以将其放在作用域链的顶部,但如果您不能完全控制环境,则这样做是有风险的。这是可能的,但我确实有大量变量和对象可从funcA()访问。funcA的范围是我需要从funcB访问的范围。请注意,我希望它也能在新的ECMAscript版本中工作。@quinton:我认为您需要对面向对象编程进行一些研究。但是使用它进行属性解析与范围链上的标识符解析非常不同。因为这是由调用设置的,所以上面的方法需要非常小心地调用。最好只是使用对象属性作为“变量”并传递该对象。@RobG您是说对
funcB()
的间接调用会失去其
上下文的脆弱性吗?你应该回答你的建议,我不是100%肯定我知道你的意思。谢谢。我只是说传递一个变量对象放在作用域链的顶部与将其设置为某个值是完全不同的。Onde处理标识符解析,另一个属性解析。在对象文本中使用它是有问题的,因为函数可能不会作为对象的方法调用。也许关闭最符合老年退休金计划的要求。我会仔细考虑一下……谢谢@RobG,是的,我知道模块模式,尽管关于良好编码的一个伟大解决方案并不完全是我想要的。希望从funcB访问在funcA内部定义的成员,而不必让成员位于2个函数之外,从而不将其作为参数(例如单独传递或作为数组传递)传递-将作用域从funcA传递到funcB。以前从未见过这样做。我认为上面使用模块模式和私有成员是我目前所能得到的最接近我所追求的,但是能够在不需要全局成员变量的情况下将范围从一个函数传递到另一个函数将是非常有用的。。。。要考虑的事情:)谢谢罗布的意见!需要注意的是,Rob的答案是最接近的,但是,在我不会将其设置为“答案”之后,它并不是我的“确切”答案。仍然接受建议。
obj = {
    funcA : function(){
        this.a = 'a';
        alert(this.a);
    },
    funcB : function(){
        // but how do you access the scope in 'funcA' to access variable 'a'?
        alert(this.a);
    }
}

obj.funcA();
obj.funcB();