我正在从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");
当我打开控制台时,我只需检查类型(平面),它就是一个对象。但如果我打电话给飞机("默认机场") - 它会引发错误。我知道"鲍里斯波尔国际机场"已经传入飞机,但如何用另一个覆盖现有价值?另外,plane是一个函数对象,为什么我不能像平面一样调用(" XXX")?
在调用plane.leaveTheAirport(" John F. Kennedy")之后,控制台将打印出John F. kennedy而不是Boryspil国际机场。任何人都可以解释为什么外部范围的旧值被旧的替换?
答案 0 :(得分:1)
1.当我打开控制台时,我只检查typeof(平面)并且它是一个对象。
确定。
typeof 是一个运算符,不需要分组运算符,因此:typeof plane
就足够了。
但如果我打电话给飞机(“默认机场”) - 它会抛出错误
对象不实现调用,函数执行,因此是预期的。
“鲍里斯波尔国际机场”已经进入飞机,但如何用另一个机场覆盖现有价值?另外,plane是一个函数对象,为什么我不能像平面一样调用(“XXX”)?
我认为你的意思是“为lastAirportLeft 分配一个新值”。分配给 plane.leaveTheAirport 的函数有一个 lastAirportLeft 变量的闭包,因此它可以设置值(它确实如此)。
另外,plane是一个函数对象,为什么我不能像平面一样调用(“XXX”)?
不,不是。如果是,typeof plane
将返回'function'
,请参见上文。
- 在调用plane.leaveTheAirport(“John F. Kennedy”)之后,控制台将打印出John F. kennedy而不是Boryspil国际机场。任何人都可以解释为什么外部范围的旧值被旧的替换?
醇>
因为 plane.leaveTheAirport 对变量有一个闭包,所以它可以访问它。
答案 1 :(得分:0)
plane
是文字定义的对象:
{
leaveTheAirport: function(airPortName) {
lastAirportLeft = airPortName;
}
}
因为这是在初始化plane
的表达式中调用的函数返回的内容。所以plane
是一个普通的Javascript对象,它有一个属性leaveTheAirport
,它是一个可以访问某些闭包变量的函数(即:defaultAirport
,lastAirportLeft
和{{ 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'