//全局变量
/*var name = "胡歌";
function f(){
name = "霍建华";
}
f();
console.log(name); //霍建华
*/
//局部变量 只能在固定代码片段中访问到的变量
//局部变量,先在函数内部的作用域找变量name,如果找到则使用,找不到再去父集作用域找name变量
/*function f(){
var name = "张盛超";
console.log(name);
}
f();
console.log('____' + name);*/ // 出错
//注意事项
//不使用var声明的变量是全局变量
/*function f(){
name = "张盛超";
console.log(name);
}
f();
console.log('____' + name);*/ //能够输出 不推荐使用
//变量退出作用域后会被销毁,全局变量关闭网页后才会被销毁 就是局部含量在 函数运行后 就被销毁了
//块级作用域 大括号内{} ES5中无意义 ES6中存在意义
//作用域链
//先于当前作用域找变量 逐层往上找
//只要是代码 就至少有一个作用域 即全局作用域
//凡是代码中有函数 那么在作用域中又可以诞生一个作用域
//函数中如果还有函数 就又声称一个作用域
/*function f1(){
function f2(){
}
}
var str = "nui";
function f3(){
function f4(){
}
}*/
//此中有三个作用域 存在同级作用域 str也是一个作用域
//如果没有函数 均是全局 if……
//其他语言中变量i 只能在for循环内部访问 JS中为全局变量
/*for (var i = 0; i < 10; i++) {}
console.log(i);*/
/*var color = "yellow";
function getColor(){
var anotherColor = "red";
function swapColor(){
var tmpColor = color;
color = anotherColor;
anotherColor = tmpColor;
}
swapColor();
}
getColor();
console.log(color);*/
</script>
<script id = "预解析">
//概念
//JS代码是由浏览器的JS解析器来执行的
//JS解析器执行JS代码时,分为两个过程:预解析过程和代码执行过程
//预解析的过程
//1、把变量的声明提升到当前作用域的最前面,只会提升声明,不会提升赋值
//2、把函数的声明提升到当前作用域的最前面,只会提升声明,不会提升调用
//3、先提升var,然后是function
/*console.log(a); //这边会输出undefined
var a = 10;
//相当于
var a;
console.log(a);
a = 10;*/
/*var num1 = 10;
function f1(){
//var num1;
console.log(num1); //undefined
var num1 = 20;
}
f1();*/
/*console.log(fn2);//输出一个函数
function fn2(){
console.log('我是一个函数');
}
var fn2 = '我是一个变量'; //定义后
console.log(fn2); //输出 我是一个变量*/
//变量提升 定义变量的时候 变量的声明会被提升到作用域最前面 变量的赋值不会提升
//函数提升 将函数声明提至最前 但变量声明先于函数
fn3();
// console.log(num1); //报错
console.log(num2); //将上个代码注释掉后 能够输出num2 num3
console.log(num3);
function fn3(){
var num1 = num2 = num3 = 100; //因为num2 num3 非 var声明 所以是全局变量
console.log(num1);
console.log(num2);
console.log(num3);
}