这个javascript代码是如何工作的?

时间:2015-12-08 13:01:42

标签: javascript javascript-objects

据我所知,调用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());

2 个答案:

答案 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()。这没什么不对!

简而言之:

xfun

返回的routes()对象

fun有一个名为getData()的方法,它返回person

person恰好在匿名函数的范围内定义 - 您在调用routes()时执行了此操作(特别是您var x = routes(); - 这触发了person的创建)。

我希望这是有道理的。

这不是“非常明显”,但如果您按照执行顺序逐行完成代码,那么代码很容易理解,保持心理记录(或纸上)范围和变量值。

更新:其他人提供有关JavaScript闭包主题的有价值的阅读链接。阅读那些。它将教导您上面已经陈述的内容。他们更有价值(恕我直言)投票。我的回答只是解释你提供的代码的执行 - 而不是关闭闭包。 :)