将范围从一个函数传递到另一个函数

时间:2011-11-22 12:00:11

标签: javascript scope

我有一个对象litrel有2个匿名函数定义如下:

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'的范围 - 想法?

3 个答案:

答案 0 :(得分:6)

JavaScript范围不起作用,因为它具有(仅)功能范围(使用let关键字时除外)。

可以做的是......

obj = {
    a: 0,
    funcA: function() {
        this.a = 'a';
    },
    funcB: function() {
        console.log(this.a);
    }
};

jsFiddle

答案 1 :(得分:1)

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

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

见Douglas Crockford关于Private Members in JavaScript的文章。通过这种方式,函数可以在其作用域链上共享公共变量对象。您仍然无法引用它或将其传递给另一个函数,但您可能能够获得所需的功能。

答案 2 :(得分:0)

此代码是否符合您的要求?如果没有,我真的很好奇为什么。

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

访问单独函数的实际范围和在父对象上设置成员之间的区别是什么?

此外,由于没有通过范围的方法,您是否只会使用与此代码类似的内容?