作用域和全部变量及局部变量的深层理解!

作用域和全部变量及局部变量:

全局作用
其变量可以作用在全局中;但是如果函数内部有局部变量那么优选选取局部变量;
取值规则遵循如下三点:
第一:声明提升;(在这里涉及到关于浏览器执行读取代码的知识;首先,其运行原理是选预编译然后再执行!)
预编译:预编译这个过程就包括声明提升这个过程;其提升函数和声明的变量;

var a = 10;
			function foo(){
				console.log(a);//undefined
				var a = 20;
			}
			foo(a);

其结果就是underfined;
因为在浏览器读取代码时,进行预编译,将函数foo()提升;将函数内部的声明提升;此时,就如同下面的代码:

var a = 10;
			function foo(){
				var a
				console.log(a);
			    a = 20;
			}
			foo(a);
			那么,当调取函数foo(a)时,虽然a=10这个值传到了实参,但是形参没有值;而在预编译时,下面执行了声明提升;于是定义了a这个变量但是没有赋值;所以执行结果是undefined;如果把上面的代码改为如下:
	

var a = 10;
	function foo(){
		
		console.log(a);//结果为10;
	    a = 20;
	}
	foo(a);
	此时,输出的结果为 10;
	如果改为如下:
var a = 10;
			function foo(a){
				
				console.log(a);//结果为10;
			    a = 20;
			}
			foo(a);
			此时进行了实参传给形参;如果形参有了变量那么就相当于在函数内部定义了a;var a;
			此时,形参的值是10;
如果将实参的a去掉;那么结果就不同了:
	var a = 10;
		function foo(a){
			
			console.log(a);//结果为undefined;
		    a = 20;
		}
		foo();		
		就如同前面所说;给形参定义变量;就相当于在函数内部定义了变量a;

我们只需记住如下三个读取规则即可:
第一:声明提升;
第二:如果 函数的形参定义了变量;那么就相当于给函数内部定义了局部变量a;
第三:以上两点理解后,就是函数在执行时遵循就近原则;

当要 输出console.log(a);时那么向上开始寻找变量a的值;如果形参也没有变量;那么继续向上寻找;此时会寻找到全局变量的值;如下:

var a = 10;
			function foo(){
				
				console.log(a);//结果为10;
			    a = 20;
			}
			foo(a)

但是,如果在函数外边再输出a;那么此时会出现两个值;如下:

var a = 10;
			function foo(){
				
				console.log(a);//此结果为10;
			    a = 20;
			}
			foo(a);
			console.log(a);//此结果为20;

此时,就又涉及到全局变量的定义:
第一:最外层函数和最外层函数外通过var来定义的变量
第二:在函数内部不通过var来定义的变量;

此时的20为全局变量;当里面的值输出后;其又覆盖了原值10;结果变为20;并且输出;但是:如果给函数的形参定义一下;如下:

var a = 10;
			function foo(a){
				
				console.log(a);//此结果为10;
			    a = 20;
			}
			foo(a);
			console.log(a);//此结果为10;

此时20就变为了局部变量;不能覆盖原来的值10;
如果我们把实参的值a去掉;那么结果就又不同了:

var a = 10;
			function foo(a){
				
				console.log(a);//此结果为undefined;
			    a = 20;
			}
			foo();
			console.log(a);//此结果为10;
			其实和上面的一个例子一样的 含义;我们只需理解上面的三个规则即可;无论其如何变化;都可以得出正确的结论;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值