来自stackoverflow wiki答案的关于IIFE的解释



我正在阅读stackoverflow wiki上的这篇文章。我想完全理解下面的代码片段。希望有人能回答以下问题。

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. 当我打开控制台时,我只需检查(平面)的类型,它就是一个对象。但若我呼叫飞机("默认机场"),它会抛出错误。我知道"Boryspil国际机场"已经通过了飞机,但如何用另一个来覆盖现有的价值?同样,平面是一个函数对象,为什么我不能像平面("XXX")那样调用?

  2. 在呼叫飞机离开机场("约翰·肯尼迪")后,控制台将打印出约翰·肯尼迪,而不是鲍里斯皮尔国际机场。有人能解释为什么外部范围的旧值被旧值取代吗?

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

好的。

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

但如果我呼叫飞机("默认机场"),它会抛出错误

对象不实现调用,函数实现调用,所以这是意料之中的事。

"Boryspil国际机场"已经通过飞机,但如何用另一个来覆盖现有的价值?同样,平面是一个函数对象,为什么我不能像平面("XXX")那样调用?

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

同样,平面是一个函数对象,为什么我不能像平面("XXX")那样调用?

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

  1. 在呼叫飞机离开机场("约翰·肯尼迪")后,控制台将打印出约翰·肯尼迪,而不是鲍里斯皮尔国际机场。有人能解释为什么外部范围的旧值被旧值取代吗

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

请参阅MDN:闭包和JavaScript中的私有成员

plane是由文字定义的对象:

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

因为这是在初始化CCD_ 5的表达式中调用的函数所返回的。因此,plane是一个普通的Javascript对象,具有单个属性leaveTheAirport,这是一个可以访问一些闭变量(即:defaultAirportlastAirportLeftcar)的函数。以下是一些更简单的例子来帮助您理解:

1)

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; };

2)

var outerValue = 'foo';
function setOuterValue ( newValue ) {
    outerValue = newValue;
}
function printOuterValue ( ) {
    console.log( outerValue );
}
printOuterValue( ); // 'foo'
setOuterValue( 'bar' );
printOuterValue( ); // 'bar'

一起:

var obj = function ( outerValue ) {
    return {
        setOuterValue: function ( newValue ) {
            outerValue = newValue;
        },
        printOuterValue: function ( ) {
            console.log( outerValue );
        }
    };
}( 'foo' );
obj.printOuterValue( ); // 'foo'
obj.setOuterValue( 'bar' );
obj.printOuterValue( ); // 'bar'

最新更新