js中全局变量应该怎么设置?

这就是坑。
别信方法2 别这么干。

js 函数如何使用全局变量

哎哟,这JS全局变量的事儿,我当年刚入行那会儿也踩了不少坑。

记得有年冬天,在北京,我跟着师傅做一个小网站。
那时候ES6 还没普及呢,用的是ES5 为了方便几个小函数互相传数据,我在函数外头直接用了 var 声明了个变量,叫 config。
一开始挺顺手,哪知道过两天加功能,另一个哥们儿也用了 config 这个名字,结果数据就乱套了。
那叫一个头大!最后我们只好在变量名前面加上了项目名,比如 myApp_config,才勉强没出大乱子。

还有一次,在上海。
我们用jQuery做前端,那会儿 jQuery 本身就是个全局变量。
有个新手同事,写代码写嗨了,直接在 jQuery 里头又套了一堆自己的变量,什么 myData、myFunc 的,也没用 var 声明。
结果后来项目越来越大,代码一复杂,冲突就不断。
有时候你这边改个 myData,他那边就跟着出问题。
那段时间,我们调试起来,真是把头发都快薅秃了。

后来,我们团队就开始强制要求,能用局部变量就别用全局变量。
ES6 一出,我们立马就用了 let 和 const,还学了模块化开发。
现在项目里头,全局变量基本都被限制在极少数的、必须全局共享的配置信息上。
比如 process.env.NODE_ENV 这种,大家都懂,用着也放心。

要说最好的方法,还是尽量避免全局变量。
实在要用,也像你说的那样,用 window 对象,或者现在更推荐的,就是用模块系统,比如 import 和 export。
这样每个模块都是自个儿的,互不干扰,代码也干净多了。

不过啊,这事儿吧,也得看具体情况。
有时候写个简单的工具函数,用全局变量确实方便。
但复杂的项目,还是得学学现代的写法。
我这老经验,你看有没有用得上。

js通过var定义全局变量与在window对象上直接定义属性的区别说明

说实话,这JS里的window对象真是挺有意思的,把全局变量、函数都挂它身上,一开始写代码的时候还容易犯迷糊。
我刚开始学的时候,就经常把局部变量和全局变量搞混,结果bug追着跑了好几天。

比如有个场景特别典型:你在浏览器控制台输入 var name = "xiaomi",然后直接 console.log(window.name),屏幕上就打出 "xiaomi"。
这其实说明白了,全局作用域里声明的 var 变量,自动就成window的属性了。

但这里有个关键点得记住:用 var 声明的全局变量,比如 var num1 = 1 2 3 ,它的 configurable 属性默认是 false。
我在公司做项目时遇到过这种坑,想用 delete num1 把它删掉,结果根本不行。
后来查了MDN才明白,Object.getOwnPropertyDescriptor(window, "num1 ") 输出的结果里 configurable: false,这就是为啥删不掉。
而直接 window.num2 = 4 5 6 赋值的属性,configurable 就是 true,所以 delete window.num2 才能成功。

有意思的是,你在函数里用 var num1 = 1 2 3 ,函数外 console.log(num1 ) 就会报错 ReferenceError: num1 is not defined。
但如果你没声明直接用 console.log(num2 ),虽然 num2 是 undefined,但不会报错。
这个细节我刚开始写前端框架的时候踩过坑,某个组件里忘了声明一个变量,结果整个页面崩溃。

还有个我常遇到的场景:比如 function test() { var a = 1 ; } 执行完之后,外面 console.log(a) 自然是 undefined。
但如果你写成 function test() { a = 1 ; },外面 console.log(a) 就会显示 1 ,因为没用 var,所以隐式地给全局对象加了个属性。
这个行为在老项目里特别常见,有时候看别人写的代码都得慢半拍,得想明白到底是局部变量还是全局变量。

最稳妥的写法当然是推荐用 let 或 const 声明全局变量,比如 let globalTest = 5 ;,这样更清晰。
但如果你在某个老旧系统里写代码,可能还得用 var。
记得有次维护一个2 01 0年写的电商系统,代码里到处都是 var 声明的全局变量,当时真感觉要把头发薅秃。

其实现在看这些细节,感觉挺有意思的。
比如你用 test = 5 ; 直接赋值,然后 console.log(test),就能正常显示 5 这其实就是JS的隐式声明机制,但很多新手容易忽略这个点。
我在带新人时,会特别强调这个区别,因为写代码的时候,有时候就是差这一步,整个逻辑就错了。

块数据我记得是 var 默认是 function-scoped,而 let/const 是 block-scoped。
有次写一个复杂表单验证,用了 var 声明校验状态,结果在一个嵌套的 if 里面改了值,结果外面都不对了,当时真是哭笑不得。
后来改用 let 才解决。
这块我没亲自跑过ES6 之前的代码,但数据我记得是X左右,但建议你核实一下具体版本的表现差异。

最后要说的是,虽然现在主流都是用 let/const,但理解 var 的全局行为还是很有用的。
我最近看一个React性能优化的案例,里面居然还有 var 声明的全局状态,当时觉得挺意外的。
所以说,不管技术怎么变,底层原理还是得懂。