作用域:
/* 变量--->局部变量和全局变量
* 作用域:就是变量的适用范围
* 局部作用域和全局作用域
* js中没有快级作用域---一对括号中定义的变量,这个变量可以在大括号外面使用
* 函数中定义的变量是局部变量
* */
// 样例1 --- 全局变量
while (true){
var num = 10;
break;
}
console.log(num);
// 样例2 --- 全局变量
{
var num2 = 100;
}
console.log(num2);
// 样例3 --- 全局变量
if(true){
var num3 = 1000;
}
console.log(num3);
// 样例4 --- 局部变量
function fun1() {
var num4 = 10000;
}
console.log(num4);
作用域链:
/*作用域链:变量的使用,从里往外,层层的搜索,搜索到了就可以直接使用了
* 层层搜索,搜索到0级作用域的时候,如果还是没有那就报错
* */
// var num = 10; // 作用域链 级别:0
function f1(){
// var num = 20; // 作用域链 级别:1
function f2(){
var num = 30; // 作用域链 级别:2
console.log(num);
}
}
f1();
预解析:(变量提升)
JavaScript 中,函数及变量的声明都将被提升到函数的最顶部。
JavaScript 中,变量可以在使用后声明,也就是变量可以先使用再声明。
JavaScript 只有声明的变量会提升,初始化的不会。
/*预解析:就是在浏览器解析代码之前,把变量的声明核函数的声明提前(提升)到该级作用域的最上面*/
// 变量的提升
// var num;
console.log(num); // undefined
var num = 100;
// 函数的声明被提前了
f1(); // 使用
function f1(){ // 声明
console.log("设个函数被执行了!");
}
// 下面不能执行
// var f2;
f2();
var f2 = function () {
console.log(this.name); // f2 is not a function
}