前端学习记录27-JavaScript-作用域、预解析、自定义对象
作用域
(变量)
通常来说,一段代码所用到的名字并不是总有效可用
限定这个名字的可用性代码范围就是这个名字的作用域
提高了程序逻辑的局限性,增强程序可靠性,减少名字冲突
js作用域(es6前)
全局作用域
整个script标签 或者是一个单独的js文件
局部作用域(函数作用域)
在函数内部就是局部作用域 代码只在函数内部起作用
同一个作用域下 相同名字有冲突 不同作用域 没冲突
变量作用域
js中根据作用域不同 变量分为两种
全局变量
在全局作用域下的变量
全局任何位置都可以使用
局部变量
在局部作用域下的变量
只能在对应的局部作用域下使用
特殊情况:不声明的变量也属于全局变量
特殊情况:函数的形参也可以看作为局部变量
从执行效率来看 全局变量和局部变量
全局变量只有浏览器关闭的时候才会销毁,比较占内存
局部变量当程序执行完毕就会销毁,比较节约资源
js在es6才有块级作用域,es5中没有
块级作用域{}
if{
//此处的变量为 应该为局部变量 但是es5中此处为全局变量
}
作用域链
只要是代码 就有作用域
如果函数中还有函数 在这个作用域中产生了新的作用域
内部函数可以访问外部函数的变量
用链式方式查找决定变量的值为多少 访问方法为
一步一步向上级查找 一旦在某父级层查找到则停止继续查找 (undefined也算值)
这种行为叫作用域链
预解析
js代码是通过js引擎来执行的
js在运行代码的时候 是先预解析再执行代码
js引擎会把js里面所有 var 和 function 提升到当前作用域的最前面
然后 执行代码 根据书写顺序从上到下执行
预解析分为 变量预解析(变量提升) 和 函数预解析(函数提升)
变量预解析
就是把所有的变量声明 提升到 当前的作用域最前面 (包括任何作用域 全局和局部)
只提升变量声明 不提升赋值
例如
console.log(num); //返回 undefined
var num = 10;
预解析后的 代码实际执行为
var num;//num 为 undefined
console.log(num);
num=10;
所以num返回值 为 undefined
再例如
fun(); //报错
var fun = function() {
console.log(22);
}
预解析后 代码实际执行为
var fun;
fun();//报错 没有定义函数
fun=function(){
console.log(22);
}//这会才定义 所以 显示没定义
函数预解析
把所有的函数声明 提升到 当前作用域最前面 不调用函数 (包括任何作用域 全局和局部)
例如:
fn()