JavaScript:如何避免事件监听器中变量在第二个if语句中丢失值?
问题根源
你的userType是事件处理函数内部的局部变量,每次触发handleEvents事件时,函数都会重新执行,var userType会被重新声明并初始化为undefined。也就是说,QCP事件触发时赋值的userType只在那次函数调用中有效,等EC事件触发时,是全新的函数调用,自然取不到之前的值。
解决方案
要让userType在多次事件触发之间保留状态,需要把它的作用域提升到事件处理函数外部,让它成为一个能跨函数调用保留值的变量。推荐用闭包实现,避免污染全局命名空间:
(function() { var userType; // 闭包变量,跨多次事件调用保留状态 q('handleEvents', function(name, data) { if (name === 'QCP') { userType = "CP"; console.log(userType); } if (name === 'EC') { console.log('EC found'); console.log(userType); window.dataLayer = window.dataLayer || []; window.dataLayer.push({ 'event': 'qlc', 'qUserType': userType }); } }); })();
如果场景允许,也可以将userType挂载到全局对象(比如window),但不推荐这种方式,容易造成全局命名冲突:
// 初始化全局变量 window.userType = window.userType || undefined; q('handleEvents', function(name, data) { if (name === 'QCP') { window.userType = "CP"; console.log(window.userType); } if (name === 'EC') { console.log('EC found'); console.log(window.userType); window.dataLayer = window.dataLayer || []; window.dataLayer.push({ 'event': 'qlc', 'qUserType': window.userType }); } });
原理说明
将userType移到闭包或全局作用域后,每次事件处理函数调用时访问的都是同一个变量,QCP事件赋值的值会被持续保留,直到被后续逻辑修改,这样EC事件触发时就能读取到之前设置的userType值。
内容的提问来源于stack exchange,提问作者ianhman
相关产品推荐
相关产品推荐

