1 var obj = function (params) { 2 var btn = { 3 type: { 4 text: 11 5 }, 6 setType: function (text) { 7 btn.type = { 8 text: text 9 } 10 }, 11 init: function (text, mark) { 12 btn.setType(text) 13 if(mark) btn.addEvent() 14 }, 15 addEvent: function (params) { 16 var events = { 17 a: function (params) { 18 $('#btn').on('click', function (params) { 19 btn.showText() 20 }) 21 } 22 } 23 24 for (var key in events) { 25 events[key]() 26 } 27 28 }, 29 showText: function () { 30 console.log(btn.type) 31 } 32 } 33 return btn 34 } 35 36 obj().init(222, true) 37 setTimeout(() => { 38 console.log('设置完了') 39 obj().init(9999) 40 }, 1000 * 6);
1.预想结果
222,9999
2.实际结果
222,222
3.原因
这里每次调用init时都要执行一次obj()方法,所以得到的内容已经不再是相同的一个了;第一次进行init时,完成了事件绑定,而第二次未再进行事件绑定,所以事件绑定中的btn一直是第一个内容;所以输出一直为第一次的222
4.解决
var obj=(function(){})()
让obj为一个立即执行函数,之后用obj.init()直接调用