具有对象成员功能的闭包

时间:2018-06-23 15:41:22

标签: javascript scope

我的问题听起来很简单:定义为对象成员的函数是否对包含对象的函数范围具有封闭性?

例如:

    function foo() {
      /* some
       *  code*/

     var obj = {
            prop1: //something;
            prop2: //something;
            someCoolProp: function() {
                  //code
             }
     }
}

someCoolProp函数引用是否在foo范围内具有闭合符?匿名函数在哪里定义,所以如果我们给它命名,它在哪里可以访问?

谢谢。

3 个答案:

答案 0 :(得分:1)

  

我的问题听起来很简单:定义为对象成员的函数是否对包含对象的函数范围具有封闭性?

     

someCoolProp函数引用是否在foo范围内具有封闭性?

是的。在对象初始值设定项中定义的对象对它结束的对象完全没有任何影响。仍然会关闭对创建它的foo的调用的上下文。

  

匿名函数在哪里定义,所以如果我们给它命名一个可以访问的名称?

从ES2015开始,该函数确实的名称为:someCoolProp。 (ES2015在规范中添加了很多函数名推断;有趣的是,大量“匿名函数表达式”不再创建匿名函数。)该名称不会添加到任何执行上下文的绑定对象中(松散地是“作用域”) ,虽然;对该功能的唯一引用是在同名对象的属性上。

但是,如果您的意思是,如果您使用的是命名函数表达式:

var obj = {
    prop1: //something;
    prop2: //something;
    someCoolProp: function someNameHere() {
    //                     ^^^^^^^^^^^^---------------- added
        //code
    }
}

...情况是一样的:因为它是函数 expression ,所以名称不会添加到定义它的上下文中。 (而具有 declaration 函数的是。)

答案 1 :(得分:1)

  

我的问题听起来很简单:定义为对象成员的函数是否对包含对象的函数范围具有封闭性?

是的。

function foo() {
    var bar = 42,
        obj = {
            prop1: 'something',
            prop2: 'something',
            someCoolProp: function() {
                console.log(bar);
            }
        };

    return obj;
}

foo().someCoolProp();

答案 2 :(得分:1)

当您声明function时,将创建一个新的作用域,这意味着其中的所有属性都是私有的,因此其他作用域都不能调用这些属性。让我用不同的示例进行解释,因为理解这一点非常重要。


在这里,您不能在x范围内调用windowx仅在foo()范围内

function foo() {
  var x = 'Hey';
  
  function transformX( val ){
    // I can call x because transformX is inside Foo()
    x = 'Ho';
  }
  
  return transformX(x);
}

console.log( foo() ); // 'Ho'
console.log( x ); // Reference Error can't read x


这是一个**********的坏习惯,我声明y时不带var关键字,因此起初window不知道y,但是在bar()执行ywindow范围内声明并附加(默认行为)!始终使用关键字声明:var | let | 'const`

function bar() {
  y = 'Hey';
  
  function transformX( val ){
    y = 'Ho';
  }
  return transformX(y);
}

console.log( y ); // 'Error y is not defined'
bar();
console.log( y ); // 'Ho'


该示例比以前更加困难,您可以在people内部和peopleObject对象内部看到一个window变量。这种做法对于保留某些变量(例如私有变量)是很好的。

var peopleObject = function(){
  
  var people = {
    name: 'Yann',
    age: 25
  }
  
  function sayMyName(){
    console.log('Hi', people.name);
  }
  
  function getName(){
    return people.name;
  }
  
  return {
    name : getName,
    p: people
  };
  
};

var people = peopleObject();
console.log( people.name() );
console.log( people.p );
console.log( people.sayMyName() ); // error sayMyName is not a function

您好,希望对您有所帮助:)