什么是作用域?
答: 代码运行时的生效范围. 有作用的领域
有哪些作用域?
全局作用域: 这里的代码在哪里都能用, 公共的
局部作用域: 函数运行时产生的, 函数私有的
块级作用域: ES6提供的
直接在脚本中书写的代码, 都属于全局作用域
全局中 声明的变量 存储在 顶级对象 -- window
window是浏览器提供的, 存储了 浏览器提供的所有 API
JS在浏览器中运行, 就可以操作 window 对象中提供的功能
宿主环境: JS代码运行时所在的平台
1. node.js -- 2阶段
2. 浏览器 -- 3阶段 - 研究运行在浏览器上的JS 有什么特点.
全局(对象)污染:
全局对象指的是 window 对象, 本质功能是存储系统级的内容
我们声明的变量默认也会存储在 window 对象里, 这并非window的主要职责, 所以说: 自定义变量 污染了 全局对象
造成的问题:
1. 属性名和系统属性重复, 会导致覆盖
2. 多个外部脚本中的变量 都存放在全局, 会导致冲突覆盖!
解决方法:
利用函数作用域来解决全局污染!
window对象
window 对象哪里来的?
浏览器提供的
window对象里的内容是做什么的
提供操作浏览器的各种功能函数
如何使用window对象中的内容
两种方式可以使用
window.属性名
属性名 : 全局中没有书写前缀, 默认到window对象中查找使用
函数作用域
// 函数运行时产生的作用域, 其中的变量使用范围仅限函数内部!
// 函数分两种状态:
// 1. 静态 -- 声明时
// 2. 动态 -- 触发函数/调用函数, 例如 函数名()
function show() {
// 这里的 x 属于 函数的私有财产, 外部无法使用
var x = 10
// 函数中声明的变量, 存储在函数的作用域对象中
// 没有存储在全局window里, 不会造成污染!
}
show() //动态
console.log('x:', x) // 10
// 快速生成函数作用域的语法: 匿名函数自调用
// var z = function () { }
// z()
; (function () {
var a = 10 // 属于函数作用域, 不会造成污染!
var b = 20
})()