全局对象
无论是浏览器环境、还是node环境。都会提供一个全局变量
- 浏览器环境:window
- node环境:global
全局对象有下面几个特点
-
全局对象的属性可以直接被访问
-
给未声明的变量赋值,实际就是给全局对象的变量赋值,在函数里也一样 !!不能这么写
-
所有的全局变量、全局函数,都会附加到全局对象
称之为全局污染,又称之为全局暴露,或简称污染、暴露
(在全局代码里面定义了一个变量、声明了一个函数,造成了全局对象多了一些属性)
若不希望把a附加到全局,我们认为a是污染了全局
希望b和c附加到全局,我们认为把b和c暴露给全局
-
如果要避免污染,需要使用立即执行函数改变其作用域
function init(){
var a = 1;//不希望全局污染,把它放到函数里
}
//函数本身有污染
立即执行函数 IIFE
//先书写函数
(function () {})()
//如果不需要把c暴露出去,不需要写var abc =
//不需要暴露的就写在里面,需要暴露的就返回,暴露出来的名字就是定义的abc
var abc = (function(){
var a = 1;//不希望污染全局
var b = 2;//不希望污染全局
function c(){
console.log(a + b)
}
var d = 123;
//return c;//返回值,想让c暴露出去
return {
c: c,
d: d,
}//把c暴露全局,赋值给abc
})();
//用()将匿名函数括起来,这就是立即执行函数