我正在从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");



当我打开控制台时,我只是检查typeof(plane),它是一个对象。但是,如果我叫飞机(“默认机场”),它将抛出错误。我知道“鲍里斯波尔国际机场”已经进入飞机,但是如何用另一个飞机覆盖现有的价值呢?另外,plane是一个函数对象,为什么不能像plane(“ XXX”)那样调用?
在调用plane.leaveTheAirport(“ John F. Kennedy”)之后,控制台将打印出John F. kennedy而不是鲍里斯波尔国际机场。谁能解释为什么将外部作用域中的旧值替换为旧值?

最佳答案

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


好。

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


  但是,如果我呼叫飞机(“默认机场”),它将引发错误


对象不实现调用,函数不实现,这是可以预期的。


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


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


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


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


  
  在调用plane.leaveTheAirport(“ John F. Kennedy”)之后,控制台将打印出John F. kennedy而不是鲍里斯波尔国际机场。谁能解释为什么将外部作用域中的旧值替换为旧值?
  


因为plane.leaveTheAirport对变量具有闭包,所以可以对其进行访问。

请参见MDN: ClosuresPrivate Members in JavaScript

关于javascript - 这个stackoverflow Wiki答案对此IIFE的解释,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34301968/

10-11 05:31