为了账号安全,请及时绑定邮箱和手机立即绑定

js 怎样理解这个问题? 闭包?模块? 从作用域上怎样理解?

js 怎样理解这个问题? 闭包?模块? 从作用域上怎样理解?

慕桂英546537 2018-12-12 18:18:09
这个问题通过几位朋友的回答,我已经理解了很多,而更深的知识,我想也不是几句话就能说清的(比如 IIEF 、单列之类的),这需要我自己去寻找相关的知识点,加深理解。最后,我会采纳“依云”的答案,毕竟他是第一个回答了这个问题的朋友,而且言之有物,所有对于另外几位朋友,我只能说声抱歉了。答案只能采纳一个,但心里的感谢是可以分为几份的。在此,真挚的感谢这几位朋友,你们的回答,对我很有帮助。这是问题:前两个输出和后两个为什么不一样?如果可以从 对象、自执行、闭包、垃圾回收(也许是与这有关)等方面或者你觉得有关的方面加以解释,本人万分感激。var myTest = (function () {    var stringA = "A";    var stringB = "B";    function setAB() {        stringA = "now is a";        stringB = "now is b";    }    function getAB() {        return {            "stringA": stringA,            "stringB": stringB        };    }    return {        "setAB": setAB,        "getAB": getAB,        "stringA": stringA,        "stringB": stringB    };})();myTest.setAB();var stringAB = myTest.getAB();console.log(myTest.stringA);//Aconsole.log(myTest.stringB);//Bconsole.log(stringAB.stringA);//now is aconsole.log(stringAB.stringB);//now is b
查看完整描述

1 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

麻烦下次把问题写在正文里不要藏在代码的注释里……另外发代码请先测试,修正任何笔误之后再粘贴过来……

myTest 的值被立即执行函数设置为了:

{

        "setAB": setAB,

        "getAB": getAB,

        "stringA": stringA,

        "stringB": stringB

}

这里的变量是立即求值的,所以这时候 myTest.stringA 就是 A 了。

setAB 随后修改了闭包内变量的值,然后 getAB 把它们返回。但它们已经和 myTest.stringA 没有关系了。要不你把最后的 return 改成这样更好看:

    return {

        "setAB": setAB,

        "getAB": getAB,

        "A": stringA,

        "B": stringB

    };


查看完整回答
反对 回复 2019-01-04
  • 1 回答
  • 0 关注
  • 463 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信