两者结合的通常就是一些地方打印出来的结果会出人意料,与预期不符。
基础是作用域,在ES5中作用域只有全局作用域和函数所代表的局部作用域(ES6中才有 {} 块级作用域)所以常常有局部作用域中的隐式全局变量会影响函数外部的隐式全局变量值(但是如果是使用var声明就不会受影响。
接下来是浏览器解析JS预编译的几点原则:
1.会提前解析代码,主要应该是将使用var声明的变量和命名函数提前解析(变量不会提前赋值,但是函数会全部解析,不会提前调用)
console.log(_name)//
function _name() {
console('a')
}
结果如上图所示。
2.当函数名和变量重名 函数优先级更高(函数会先被提升,然后才是变量)
console.log(_name)
var _name = 'zs'
function _name(prams) {
console('a');
}
3.如果函数内部变量或函数有和全局变量名字相同的,函数自己作用域内的函数或者变量“具有”优先权。
var name = 'lisi';
fn();
function fn() {
console.log(name)//
var name = 'zs'
}
4.无论是全局还是局部,尽管预编译时函数会比变量更先解析,如果名字相同的变量在函数后面,那么函数可能会被覆盖
var a = 1
function fn() {
console.log(a)//f a{}
a = 10
console.log(a)//10
return;
function a() {
console.log(a)
}
}
fn()
console.log(a) //1
如上面的代码所示尽管第一个console.log肯定输出return下面的函数本体,但是第二个console.log输出却是a=10