safari浏览器和ie10及以下的浏览器一样都是低版本的浏览器。
现在最新版本的浏览器要前后都兼容:
->向前兼容ES3/5规范
1.判断体和函数体等不存在块级上下文,上下文只有全局和私有
2.不论条件是否成立,带function的都要声明+定义
-> 向后兼容ES6规范
1.存在块级作用域,大括号中出现let/const/function……都会被认为是块级作用域
2.不论条件是否成立,带function的只提前声明,不会提前赋值了。
1. 在老版本浏览器下的变量提升:
var a = 0;
if (true) {
a = 1;
function a() {};
a = 21;
console.log(a)//21
}
console.log(a);//21
旧版本浏览器下的图解:
- 在旧版本的浏览器中没有块级作用域,只要有var或者function都会提前声明,function会提前声明加定义。
- 代码在执行的时候都会形成一个执行环境栈ECStack,此处的代码是全局下的代码所以会形成一个全局执行上下文EC(G),然后进栈(进入ECStack)执