javascript - js 怎样理解这个问题? 闭包?模块? 从作用域上怎样理解?
本文介绍了javascript - js 怎样理解这个问题? 闭包?模块? 从作用域上怎样理解?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
这个问题通过几位朋友的回答,我已经理解了很多,而更深的知识,我想也不是几句话就能说清的(比如 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);//A
console.log(myTest.stringB);//B
console.log(stringAB.stringA);//now is a
console.log(stringAB.stringB);//now is b
解决方案
麻烦下次把问题写在正文里不要藏在代码的注释里……另外发代码请先测试,修正任何笔误之后再粘贴过来……
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
};
这篇关于javascript - js 怎样理解这个问题? 闭包?模块? 从作用域上怎样理解?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文