我的Javascript学习-------基础篇(七)(关于预解析的学习)

写给自己:每天进步一点点啦!!!奥里给!!!

文章目录

  • 预解析
    • 啥是预解析??
    • 变量的预解析
    • 函数的预解析
    • 函数表达式声明函数问题
    • 几个相关小例子(来自网络各大网站收集)

预解析

啥是预解析??

y也没那么深奥,就和表面意思一模一样啦!!!

  • 预解析:在当前作用域下,js运行之前,会把带有var和function关键字声明的变量先声明,并在内存中安排好。然后从上至下解析js语句。而且function的声明优先于var声明。
    :不过下面这一点很重要
    预解析会把变量和函数的声明在代码执行之前执行完成。

变量的预解析

  • 预解析还有一种说法叫做变量提升、还有个叫函数提升的东西。
  • 变量提升: 变量的声明会被提升到当前作用域的最上面,但是对于变量的赋值却不会随之提升(敲黑板!!!)。

先从简单的东西看起,如下

console.log(num);  
var num = 23333;     
很明显,结果是 undefined

这个结果说明了啥???变量提升只提升声明,并不会提升赋值

函数的预解析

和变量预解析有一对丢类似的概念, 函数的声明会被提升到当前作用域的最上面,但是不会调用函数(敲黑板!!!)。

fun();
function fun() {
    console.log('我是DJDJDJDJ哈哈哈哈哈');
}
输出成功,奥里给!!!

函数表达式声明函数问题

看看下面这个例子!!!

fun();
var  fun = function() {
    console.log('DJDJDJDJ');
}
结果:报错提示 ”fun is not a function"??????

:该段代码执行之前,会做变量声明提升,fun此时值为undefined;而fun调用是在fun被赋值为函数体之前,此时fun的值是undefined,所以无法正确调用,所以不难发现JavaScript魅力真的有点不大一样鸭!!!

几个相关小例子(来自网络各大网站收集)

再补充几个例子,加强我的记忆,奥里给!!!
第一个:


console.log(num); // 输出undefined 
var num = 10;

上面那个相当于执行了下面的过程!!!是不是突然又觉得自己又可以了!!

var num;
console.log(num);
num = 10;

第二个:
对上面那个讲解一下还是!!!

fun(); 
var fun = function() {
       console.log(23333);

}            

相当于是下面的过程:

var fun;
fun();
fun = function() {
     onsole.log(22);
}

所以为啥报错显而易见对吧!!!
第三个:

var num = 10;
fun();
function fun() {
   console.log(num);
   var num = 20;
}

var num = 10;
function fn() {
      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();

        

相当于是:

var num;
function fun() {
   var num;
   console.log(num);
    num = 20;
}
num = 10;
fun();

第四个:

var a = 18;
f1();

function f1() {
   var b = 9;
   console.log(a);
   console.log(b);
   var a = '123';
}

相当于是:

var a;
unction f1() {
   var b;
   var a;
   b = 9;
   console.log(a);
   console.log(b);
   a = '123';
}
a = 18;
f1();

最后一个 :

f1();
console.log(c);
console.log(b);
console.log(a);

function f1() {
   var a = b = c = 9;
   console.log(a);
   console.log(b);
   console.log(c);
}
    

相当于是:

function f1() {
     var a;
     a = b = c = 9;// 相当于 var  a  = 9; b = 9; c = 9; b 和 c 没有赋值 没有var 声明,当 全局变量看
     console.log(a);
     console.log(b);
     console.log(c);
}
f1();
console.log(c);
console.log(b);
console.log(a);

解释():

  • 全局变量在代码的任何位置都可以使用
  • 在全局作用域下 var 声明的变量 是全局变量
  • 特殊情况下,在函数内不使用 var 声明的变量也是全局变量

参看第三条,b=c=9就相当于是全局变量了!!!所以为啥第二次a会报错!!!

你可能感兴趣的:(#,JavaScript)