如何从内部函数访问外部作用域?

时间:2014-05-07 19:21:49

标签: javascript closures

如何从内部函数c1访问container.a?

var container = {
    a : 'blah',
    b : function(){
        console.log(this.a); // prints 'blah'
    },
    c : {        
        // how to access container.a from here?
        c1: function(){
            // and here?
        }
    }
}

3 个答案:

答案 0 :(得分:4)

只需将容器称为封闭

即可
var container = {
    a : 'blah',
    b : function(){
        console.log(this.a); // prints 'blah'
    },
    c : {        
        c1: function(){
            console.log(container.a)
        }
    }
}

答案 1 :(得分:3)

按名称:

var container = {
  a : 'blah',
  b : function(){
    console.log(this.a); // prints 'blah'
  },
  c : {        
    // how to access container.a from here?
    c1: function(){
      console.log(container.a);
        // and here?
    }
  }  
}

答案 2 :(得分:3)

可以引用包含对象引用的外部变量,但这不一定是稳定的。如果更改“容器”的值,它将不起作用。为了防止这种情况,您可以将对象定义封装在匿名函数中:

var container = function() {
  var obj = {
    a : 'blah',
    b : function(){
      console.log(this.a); // prints 'blah'
    },
    c : {        
      c1: function(){
        console.log(obj.a)
      }
    }
  };

  return obj;
}();

看起来非常相似,但通过这样做,你可以保证“obj”的值不会改变(除非对象中的某些其他功能改变它,这将是一个奇怪的要做的事)。现在,无论最初分配给“容器”的对象发生了什么,.c.c1()函数都将继续工作。