jQuery全局变量在函数内失效返回Undefined问题咨询
test_1在jQuery ready函数里显示undefined? 别着急,这种情况我碰过好多次,大概率是下面几个常见原因之一,咱们一个个排查:
1. 脚本加载顺序搞反了
你是不是把声明var test_1 = "None";的脚本放在了jQuery ready函数所在的脚本之后加载?
比如页面里是这样的:
<script src="jquery.js"></script> <script> $(function(){ console.log(test_1); // 这里执行时,test_1还没被声明呢! }); </script> <script> var test_1 = "None"; </script>
因为jQuery的ready函数会在DOM加载完成后立即执行,但如果你的全局变量是在之后的脚本里才声明的,那执行ready函数时变量还没定义,自然输出undefined。
解决办法:把声明全局变量的脚本放在jQuery代码之前加载。
2. 变量被局部作用域遮蔽了
有没有可能在某个函数(包括ready函数内部)里,你又用var(或者let/const)重新声明了同名的test_1?
比如:
var test_1 = "None"; $(function(){ var test_1; // 这里用var声明了局部变量,覆盖了全局的 console.log(test_1); // 输出undefined,因为局部的test_1还没赋值 });
这种情况下,局部作用域的变量会“遮蔽”全局变量,导致你访问的是局部未赋值的那个,而不是全局的。
解决办法:检查ready函数内部有没有重名的变量声明,去掉多余的var/let/const。
3. 你的脚本运行在模块模式下
如果你的脚本标签加了type="module",比如:
<script type="module"> var test_1 = "None"; </script>
模块里的变量默认不会成为全局变量,而是属于模块内部的作用域。这时候即使在全局声明,其他非模块脚本也访问不到它。
解决办法:如果要在模块里定义全局变量,可以把它挂载到window对象上:
window.test_1 = "None";
这样在ready函数里就能通过window.test_1(或者直接test_1,因为全局变量默认是window的属性)访问到了。
4. 变量名拼写错误
别笑,这真的是常犯的小错误!比如你声明的是test_1,但在ready函数里写成了testl(把1写成了l)或者test_11,那肯定会输出undefined。仔细检查一下拼写是否完全一致。
5. 严格模式下的意外情况
如果你的代码开启了严格模式("use strict";),某些不当的写法可能导致变量无法成为全局的。比如在严格模式下,如果没有声明就赋值变量会报错,但如果是声明了但位置不对,也可能有问题。不过这种情况相对少见,前面几个原因更大概率。
内容的提问来源于stack exchange,提问作者Santha Kumar

