JavaScript 中,在函数体内 var 声明的变量是函数级作用域,是局部变量,在本函数体内可以访问,而且是在函数体内任意位置可以访问
functiontest(){
console.log(val);var val ='this is val';
console.log(val);func();functionfunc(){for(var i =0; i <5; i++){}
console.log('i: ', i);
console.log('this is func');}}test();
上述代码结果是
undefinedthis is val
i:5this is func
如下解析
functiontest(){// 变量提升, 缺省值是 undefinedvar val;// 函数声明提升functionfunc(){// 变量提升var i;for(i =0, i <5, i++){}
console.log('i: ', i);
console.log('this is func');}
console.log(val);// 变量赋值
val ='this is val';
console.log(val);func();}
// 1问// console.log(num);// 2问
console.log(num);//undefined 坑1var num =10;// 相当于执行了以下代码// var num;// console.log(num);// var num = 10;// 3问 (函数提升)fn();functionfn(){
console.log(11);}// 4问fun();//报错 坑2varfun=function(){
console.log(22);}// 函数表达式 调用 必须写在函数表达式的下面// 相当于执行了以下代码// var fun;// fun();// fun = function() {// console.log(22);// }// 1.我们js引擎运行js分为两步: 预解析 代码执行// (1)预解析 js引擎会把js 里面所有的var 还有function 提升到当前作用域的最前面// (2)代码执行 按照代码书写的顺序从上往下执行// 2.预解析分为 变量预解析(变量提升) 和 函数预解析(函数提升)// (1)变量提升 就是把所有的变量声明提升到当前的作用域最前面 不提升赋值操作// (2)函数提升 就是把所有的函数声明提升到当前作用域的最前面 不调用函数
预解析案例
// 案例1 undefinedvar num =10;fun();functionfun(){
console.log(num);var num =20;}// 相当于执行了以下操作// var num;// function fun() {// var num;// console.log(num);// num = 20;// }// num = 10;// fun();// 案例2 // 案例2f1();
console.log(c);
console.log(b);
console.log(a);functionf1(){var a = b = c =9;
console.log(a);
console.log(b);
console.log(c);}// 相当于以下代码functionf1(){var a;
a = b = c =9;// var a = b = c = 9;// 相当于 var a = 9; b = 9; c = 9; b和c直接赋值 没有var声明 当全局变量看// 集体声明 var a = 9, b = 9, c = 9;
console.log(a);//9
console.log(b);//9
console.log(c);//9}f1();
console.log(c);//9
console.log(b);//9
console.log(a);//报错// 案例3 undefined,20var num =10;functionfn(){
console.log(num);var num =20;
console.log(num);}fn();// 相当于以下代码// var num;// function fn() {// var num;// console.log(num);// num = 20;// console.log(num);// }// num = 10;// fn();