JS中函数的作用域及作用域链以及预解释

全局变量:在函数以外用var声明的变量在全局都可以数用,就是全局变量(如果页面不关闭,那么就不会释放,就会占内存,消耗内存)

局部变量:在函数内部定义的变量是局部变量,只能在函数内部使用,外部不能使用(*当函数调用完毕,局部变量就释放了);

全局作用域:全局变量使用的范围
作用域链:

 	var num = 10;
		function f1(num){
		    var num = 20;
		    function f2(){
		        var num = 30;
		  	console.log(num);
		       function f3(){
		           var num = 40;
		        
		       }
		       f3();
		    }
		    f2();
		}
		console.log(f1(10))
		//结果为40
		//如果f3中没有num就会到f2中去寻找num,找到后打印f2中的值,如果没有到f1中寻找num,如果有打印f1的num值,如果没有再到全局中寻找num,找到打印num的值,作用域链的形成与函数定义阶段和函数在哪里执行怎么执行,与关系。

预解析
在解析代码之前,把变量的声明和函数的声明提前到当前所在的作用域的最上面,执行期上下文,找形参和变量声明 将变量和形参作为AO的属性名 值为undefined,将实参和形参统一,在函数里面找函数声明,值赋予函数体,函数执行完毕。

f1();
function f1(){
console.log(“函数的预解析”);
}

上面的代码把函数提前声明了,所以f1调用的时候不会报错

//案例1:
f1();
function f1(){
console.log(num);
var num = 10;
}
上面的代码相当于:
function f1(){
var num;//undefined,因为只定义了还没赋值就调用了,所以结果是undefined,如果没有预解析,就会报错
console.log(num);
num = 10;
}
f1();

案例2:

  function fn(a,b){
 	  	 console.log(a)// 打印 fn(a){  }
 	  	 console.log(b)// 打印 fn	 	n(b){  }  	 
 	  	   c=50;
 	  	  var c= function(e){
 	  	 
 	  	  }	 	  	  
 	  	  console.log(c); //fn
 	  	 	a=999; 
 	  	 function a(){
 	  	 
 	  	 }
 	  	 console.log(a); //999
 	  	 function b(d){
 	  	 	
 	  	 }
 	  	 b=333;
 	  	 console.log(b); //333
 	 }
 	  
 	fn(10,20)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值