/*这确实是历史遗留问题。在ES5的时候,不存在块级作用域,函数声明都会提升到全局作用域或函数作用域的顶端。
到了现在ES6的年代,有了块级作用域,函数就可以在块级作用域中定义了。 函数声明会提到块级作用域的顶端。
但是这样一来。函数的定义行为就和以前的代码不兼容了,
为了保证和以前的兼容性,就要在块级作用域中定义函数的同时,在全局作用域或函数作用域中再定义一次函数。
ES6在附录B里面规定,浏览器的实现可以有自己的行为方式,这样不同的浏览器的行为就又不一样了。
ie11 是函数声明提到块级作用域的顶端定义函数时一起在全局作用域或函数作用域中再定义一次函数。
而谷歌浏览器却是先把函数提到块级作用域的顶端定义函数,之后在代码执行到原本定义函数的地方再在全局作用域或函数作用域中再定义一次函数。
而且它的实际操作是把函数名变量的当前值赋值给全局作用域或函数作用域中的同名变量。
*/
var q=0;
if(true){
console.log(q);//f
console.log(window.q);//0
//当作用域中有函数定义时,变量值会分化
console.log('2=',q,window.q);//函数声明的优先级比变量高//2,f,0
q=5;
console.log('3=',q,window.q);//3=,5,0
function q(){
console.log("函数");
}
console.log("4=",q,window.q);//4=,5,5
q=21;
console.log("5=",q,window.q);//5=,21,5
console.log(q);//21
}
console.log(q);//5