我正在阅读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");
当我打开控制台时,我只需检查(平面)的类型,它就是一个对象。但若我呼叫飞机("默认机场"),它会抛出错误。我知道"Boryspil国际机场"已经通过了飞机,但如何用另一个来覆盖现有的价值?同样,平面是一个函数对象,为什么我不能像平面("XXX")那样调用?
在呼叫飞机离开机场("约翰·肯尼迪")后,控制台将打印出约翰·肯尼迪,而不是鲍里斯皮尔国际机场。有人能解释为什么外部范围的旧值被旧值取代吗?
1.当我打开控制台时,我只检查(平面)的类型,它是一个对象。
好的。
typeof是一个运算符,不需要分组运算符,所以:typeof plane
就足够了。
但如果我呼叫飞机("默认机场"),它会抛出错误
对象不实现调用,函数实现调用,所以这是意料之中的事。
"Boryspil国际机场"已经通过飞机,但如何用另一个来覆盖现有的价值?同样,平面是一个函数对象,为什么我不能像平面("XXX")那样调用?
我认为您的意思是"为lastAirportLeft分配一个新值"。分配给plane.leaveTheAirport的函数对lastAirportLeft变量有一个闭包,因此它可以设置值(而且确实如此)。
同样,平面是一个函数对象,为什么我不能像平面("XXX")那样调用?
不,不是。如果是,typeof plane
将返回'function'
,请参见上文。
- 在呼叫飞机离开机场("约翰·肯尼迪")后,控制台将打印出约翰·肯尼迪,而不是鲍里斯皮尔国际机场。有人能解释为什么外部范围的旧值被旧值取代吗
因为plane.leaveTheAirport有一个变量的闭包,所以它可以访问它。
请参阅MDN:闭包和JavaScript中的私有成员。
plane
是由文字定义的对象:
{
leaveTheAirport: function(airPortName) {
lastAirportLeft = airPortName;
}
}
因为这是在初始化CCD_ 5的表达式中调用的函数所返回的。因此,plane
是一个普通的Javascript对象,具有单个属性leaveTheAirport
,这是一个可以访问一些闭变量(即:defaultAirport
、lastAirportLeft
和car
)的函数。以下是一些更简单的例子来帮助您理解:
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'