来自此stackoverflow维基回答

时间:2015-12-16 00:26:23

标签: javascript frontend

我正在从stackoverflow wiki阅读此post。我想完全理解以下代码片段。希望有人可以帮助解决以下问题。

var plane = function(defaultAirport) {
                var lastAirportLeft = defaultAirport;
                var car = {
                    driver: {
                        startAccessPlaneInfo: function() {
                            setInterval(function() {
                                console.log("Last airport was " + lastAirportLeft);
                            }, 20000);
                        }
                    }
                };
                car.driver.startAccessPlaneInfo();
                return {
                    leaveTheAirport: function(airPortName) {
                        lastAirportLeft = airPortName;
                    }
                }
            }("Boryspil International Airport");


            plane.leaveTheAirport("John F. Kennedy");
  1. 当我打开控制台时,我只需检查类型(平面),它就是一个对象。但如果我打电话给飞机("默认机场") - 它会引发错误。我知道"鲍里斯波尔国际机场"已经传入飞机,但如何用另一个覆盖现有价值?另外,plane是一个函数对象,为什么我不能像平面一样调用(" XXX")?

  2. 在调用plane.leaveTheAirport(" John F. Kennedy")之后,控制台将打印出John F. kennedy而不是Boryspil国际机场。任何人都可以解释为什么外部范围的旧值被旧的替换?

2 个答案:

答案 0 :(得分:1)

  

1.当我打开控制台时,我只检查typeof(平面)并且它是一个对象。

确定。

typeof 是一个运算符,不需要分组运算符,因此:typeof plane就足够了。

  

但如果我打电话给飞机(“默认机场”) - 它会抛出错误

对象不实现调用,函数执行,因此是预期的。

  “鲍里斯波尔国际机场”已经进入飞机,但如何用另一个机场覆盖现有价值?另外,plane是一个函数对象,为什么我不能像平面一样调用(“XXX”)?

我认为你的意思是“为lastAirportLeft 分配一个新值”。分配给 plane.leaveTheAirport 的函数有一个 lastAirportLeft 变量的闭包,因此它可以设置值(它确实如此)。

  

另外,plane是一个函数对象,为什么我不能像平面一样调用(“XXX”)?

不,不是。如果是,typeof plane将返回'function',请参见上文。

  
      
  1. 在调用plane.leaveTheAirport(“John F. Kennedy”)之后,控制台将打印出John F. kennedy而不是Boryspil国际机场。任何人都可以解释为什么外部范围的旧值被旧的替换?
  2.   

因为 plane.leaveTheAirport 对变量有一个闭包,所以它可以访问它。

请参阅MDN: ClosuresPrivate Members in JavaScript

答案 1 :(得分:0)

plane是文字定义的对象:

{
    leaveTheAirport: function(airPortName) {
        lastAirportLeft = airPortName;
    }
}

因为这是在初始化plane的表达式中调用的函数返回的内容。所以plane是一个普通的Javascript对象,它有一个属性leaveTheAirport,它是一个可以访问某些闭包变量的函数(即:defaultAirportlastAirportLeft和{{ 1}})。以下是一些简单的例子可以帮助您理解:

1)

car

2)

var x = function ( ) { return 2; }( );
// x === 2, and x is a number, not a function
// Notice the difference between this and:
var x = function ( ) { return 2; };

合:

var outerValue = 'foo';

function setOuterValue ( newValue ) {
    outerValue = newValue;
}

function printOuterValue ( ) {
    console.log( outerValue );
}

printOuterValue( ); // 'foo'
setOuterValue( 'bar' );
printOuterValue( ); // 'bar'