预解析:
//函数调用的时候,会把函数的声明提升到作用域的上面
f1();//调用
var num = 20;//这个变量的声明会提升到变量使用之前
function f1() {
console.log(num);
}
//他真正的执行顺序:
var num;
function f1() {
console.log(num);
}
f1();
var num = 20;
故结果就是:undefined
<script>
//函数调用的时候,会把函数的声明提升到作用域的上面
// f1();//调用
// var num = 20;//这个变量的声明会提升到变量使用之前
// function f1() {
// console.log(num);
// }
//----------------------------------------------
/*
* 预解析中,变量的提升只会在当前的作用域中提升,提升到当前的作用域的最上面
* 函数中的变量只会提升到函数的作用域中的最前面,不会在外面取到
* 预解析会分段(多对的script标签中函数重名,预解析的时候不会冲突)
* 先提升var 再提升function
* */
// function f1() {
// console.log(num);//undefined
// var num = 10;
// }
// f1();
// console.log(num);//结果会报错
f1();
function f1() {
console.log("哈哈");
}
</script>
<script>
function f1() {
console.log("嘎嘎");
}
</script>
<script>
console.log(a);//预解析会将下面的两个声明都提前,先提前var,再提升function,那么当输出的时候,输出离console.log最近的一个
function a() {
console.log('aaaa');
}
var a=1;
console.log(a);//输出结果为1
</script>
隐式全局变量:
<script>
function getStr() {
str = "我爱小杰";//str为隐式全局变量,可以在函数外面拿到,但是要调用函数
}
getStr();
console.log(str);
</script>
<script>
f1();//两对script标签中函数重名没有冲突,预解析声明变量的提升,仅在当前的作用域中提升,最终姐夫哦为"哈哈"
function f1() {
console.log("哈哈");
}
</script>
<script>
function f1() {
console.log("嘎嘎");
}
</script>
<script>
f1();
var f1 = function () {
console.log(a);
var a=10;
}
//相当于变成这样
var f1;
f1();//报错,f1是变量,不可调用
f1 = function () {
console.log(a);
var a=10;
}
</script>