Vue中定义全局变量与常量的各种方式详解,大厂前端核心面试题出炉

23 阅读4分钟

1

import './global.js'

在项目中使用:

1

a // 报错

发现报错了, a 并没有定义. 为什么?

这个涉及到模块作用域:

1 每一个 js 都相当于一个模块, 一个模块有自己的模块作用域. 

意思就是说: 其中的变量方法, 都只在这个模块上面生效.

尝试2: 

将变量放到 Vue.prototype 上面, 通过插件全局引入

创建 global.js, 这样写:

1

2

3

4

5

6

let a = 10;

export default {

 install () {

 Vue.prototype.$a = a;

 }

}

在 入口文件中引入:

1

2

import G from './global'

Vue.use(G);

在项目中使用:

1

this.$a

的确可以, 但是这样的方式并不好, 在任何 this 不指向 Vue 的地方, 你都没有办法使用这个变量.

尝试3: 

将变量放到 window 对象上面

创建 global.js

1

window.a = 10;

在入口文件中引入

1

import './global.js'

在项目中使用:

1

a

可行, 这种方式只要你能访问到 window 对象, 就能访问到这个变量. 

有什么缺点吗? 

暂时没有发现.

实际的场景分析:

在实际情景上, 你可能拥有一份配置, 比如说微信公众号开发的时候, 你有一份配置, 写着

appId 和 appKey, 希望可以全局访问到. 

按照上面的讨论, 你应该这么写:

global.js

1

2

window.appId = 123;

window.appKey = 'abc';

可以很明显的看到, 一旦你要定义的变量或者常量过多, 就能疯了. 

所以我们希望有一种方式, 我们定义还是按照自己的方式定义:

1

2

appId = 123;

appKey = 'abc';

然后有一个方法fn, 可以将这两个参数, 直接绑定到 window 对象上面

1

fn (appId, appKey);

结果就是 appId, appKey 都会被绑定到 window 对象上面.

实现:

你需要传递一个对象给方法 fn, fn 负责将这个对象中的每一个 key 都绑定到 window 对象上面.

1

2

3

4

5

let bindToGlobal = obj => {

 for (let key in obj) {

 window[key] = obj[key]

 }

}

更新版本:

你这样用之后, 所有的变量/常量都绑定在 window 对象上面, 很容易就和已经存在 window 对象上面的变量冲突, 所以要收敛你的行为, 这样:你先在window 对象上面设置一个属性, 属性值是一个对象, 比如这样:

1

window.key = {};

然后将你所有需要设置的全局变量, 方法, 都放到 window.key 里面而不是 window 上面.

1

2

3

4

5

6

let bindToGlobal = obj => {

 window.abc = {};

 for (let key in obj) {

 window.abc[key] = obj[key]

 }

}

更近一步, 可以让这个 key 的名字为 _const 或者 _var, 或者让用户自己控制这个变量的名字.

1

2

3

4

5

6

let bindToGlobal = (obj, key='var') => {

 window[key] = {};

 for (let i in obj) {

 window[key][i] = obj[i]

 }

}

现在大致已经可以了, 然后你要解决一下, 如果重复调用 'bindToGlobal' 后面的会覆盖掉前面所定义的 变量/常量, 而我们要的是 追加, 不是覆盖, 所以代码做个调整:

1

2

3

4

5

6

7

8

9

let bindToGlobal = (obj, key='var') => {

 if (typeof window[key] === 'undefined') {

 window[key] = {};

 }

  

 for (let i in obj) {

 window[key][i] = obj[i]

 }

}

到这里已经结束了. 

最后对 'bindToGlobal' 做一个修改, 使得你以后使用的时候比较简单方便一点

讨论一下:

虽然开放了绑定在 window 对象上面的对象的名字, 但是你是不是就可以随便起名字?

假设你有两份配置, 都是常量, 

一份是 http.js, 配置了全局请求的域名

一份是 wexin.js 配置了公众号里面的一些 appId, appkey

结尾

学习html5、css、javascript这些基础知识,学习的渠道很多,就不多说了,例如,一些其他的优秀博客。但是本人觉得看书也很必要,可以节省很多时间,常见的javascript的书,例如:javascript的高级程序设计,是每位前端工程师必不可少的一本书,边看边用,了解js的一些基本知识,基本上很全面了,如果有时间可以读一些,js性能相关的书籍,以及设计者模式,在实践中都会用的到。

html5 开源分享:docs.qq.com/doc/DSmRnRG…