欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

js的预解析和作用域

程序员文章站 2023-11-21 13:14:40
预解析指的就是,在js文件或者script里面的代码在正式开始执行之前,进行的一些解析工作。这个工作很简单,就是在全局中寻找var关键字声明的变量和通过function关键字声明的函数。 1.寻找 var function 参数 等关键字,根据var a提前设置为 a=未定义(undefined)  ......

预解析指的就是,在js文件或者script里面的代码在正式开始执行之前,进行的一些解析工作。这个工作很简单,就是在全局中寻找var关键字声明的变量和通过function关键字声明的函数。

1.寻找 var function 参数 等关键字,根据var a提前设置为 a=未定义(undefined) ,所有的变量,在正式运行前都提前赋值了一个未定义。

2.函数在正式运行代码前,都是整个函数块。fn1=function  fn1(){alert(2);}

执行js代码一般分两步:1.预解析代码。   2.逐行执行代码。

var a = 1; 

var b;// 

c = 3;// 

function d(){//用声明的方式声明的函数

    console.log('hello');

}

var e = function(){//函数表达式

    console.log('world');

}

 

强调:1、预处理的函数必须是js中用声明的方式声明的函数(不是函数表达式)

 

 

当变量和函数重名时:就只留下函数的值,不管顺序谁前谁后。所以函数的优先级比变量高。注意:这只是预解析。

当函数和函数重名时:会留下后面那个,会遵循上下文机制。

  1. 预解析后会正常的读取代码(由上至下)

下面举例说明一下预解析:

var fn=456;

function fn(){

console.log('123')

}

在上述的代码中我们预解析后会变成: 

var fn;    //fn的值未定义

//fn的值是函数本身  也就是functionfn(){console.log('123')}

function fn(){   

console.log('123')

}

fn=456;     //代码逐行执行   fn被赋了一个新的值456

 js的预解析和作用域

作用域在js中同样也是一个重要的概念。它不复杂,因为es5中只有全局作用域和函数作用域,我们都知道他没有块级作用域。但在es6中多了一个let,他可以保证外层块不受内层块的影响。即内层块形成了一个块级作用域,这是let的一个特点。它不简单,因为在许多的函数嵌套的情景下,只有对它理解深刻,才能更好的去分析。今天我们着重讲的是函数作用域与全局作用域。

var a=1;

function f1(){

   var b=2;   

}  

}

作用域是在一个函数创建时就已经形成的,而不是调用时

var a=1;

function fn1(){

    console.log(a)

};

fn1()  

第二种

function fn1(){

var a=1;  

};

fn1();

console.log(a);  

第三种

var a=1;

function fn1(){

    console.log(a)

a = 2;

};

fn1();

console.log(a);

第四种

var a=1;

function fn1(){

    console.log(a)

var a = 2;

};

fn1();

console.log(a);  

1.全局变量和它的作用域

  全局变量是指在程序开头的说明部分定义和说明的量。它的作用域分为两种情况:

(1)在全局变量和局部变量不同名时,其作用域是整个程序。

(2)在全局变量和局部变量同名时,全局变量的作用域不包含同名局部变量的作用域。

 

面试题一

var a = 10;    

function f1(){    

  var b = 2 * a;    

  var a = 20;

  var c = a+1;    

  console.log(b);     

console.log(c);   

}    

f1()