据我所知,调用routes()并分配给x会为它分配一个有趣的对象。但是调用x.getData()它会返回person。它如何返回路由函数本地的person对象? 我对最后两行特别感兴趣。
var routes=function(){
var person={
fname:'Roger',
lname:'Federer',
city:'Paris'
}
var fun={
getData:function(){
return person
}
}
return fun;
}
var x=routes();
console.log(x.getData());
答案 0 :(得分:3)
这是关于JS闭包和词法范围:
getData
对象中的函数fun
可以访问routes
对象的范围。它在“你不懂JS”一书中有详细解释。
https://github.com/getify/You-Dont-Know-JS/blob/master/scope%20&%20closures/ch5.md
答案 1 :(得分:2)
仔细看看流程:
var routes = function() {
var person = {
fname: 'Roger',
lname: 'Federer',
city: 'Paris'
}
var fun = {
getData:function() {
return person
}
}
return fun;
}
var x = routes();
console.log(x.getData());
首先,您定义了匿名函数。
当调用匿名函数时:
person
(本地在其内部自己的范围内)定义对象fun
(也在其自己的内部范围内)
当它定义fun
时,它还定义了返回getData()
的方法person
- 在外部范围内声明(在我们刚才描述的最外面的匿名函数内)。
最外面的匿名函数返回fun
完成。
然后你调用匿名函数。(通过routes()
。)
致电routes()
会返回fun
,这意味着您可以执行routes().getData()
并将其解析为getData:function() {
声明。
正如我们所说,它从最外层匿名函数的范围返回person
对象。它可以被getData()
的定义访问 - 所以它可以解决。
当您致电var x = routes()
时,您获得了routes()
的返回值 - fun
,因为这是routes()
返回的内容。你只是走了一条更复杂的路线去到x.getData()
。这没什么不对!
简而言之:
x
是fun
routes()
对象
fun
有一个名为getData()
的方法,它返回person
person
恰好在匿名函数的范围内定义 - 您在调用routes()
时执行了此操作(特别是您var x = routes();
- 这触发了person
的创建)。
我希望这是有道理的。
这不是“非常明显”,但如果您按照执行顺序逐行完成代码,那么代码很容易理解,保持心理记录(或纸上)范围和变量值。
更新:其他人提供有关JavaScript闭包主题的有价值的阅读链接。阅读那些。它将教导您上面已经陈述的内容。他们更有价值(恕我直言)投票。我的回答只是解释你提供的代码的执行 - 而不是关闭闭包。 :)