javascript作用域解析

本文深入讲解JavaScript作用域机制,包括全局与局部作用域的区别、变量提升现象、闭包原理及作用域链等核心概念。

javascript作用域问题是js中比较难以判断的问题,关于作用域问题,你需要掌握以下几个要点

1,js是基于对象设计的语言,一切皆对象,函数也是对象,而一切对象都是处在window这个对象下派生出来的

var a=20;

function setAge(){
var a=12;

alert(a);

}

setAge();

alert(a);

实际上上述代码是在window这个对象上添加了全局属性a=20,以及方法setAge().  而function也是一个对象,下面有自己的属性var a=12以及显示自己属性的alert方法

2,局部变量是在声明在函数之中的,局部变量作用域函数体之中,函数体外无法访问函数体内部变量.

function setAge(){
var a=12;

}

alert(a);//undefined 外部无法访问函数体内部的a

3,没有使用var申明的变量,会被当作全局变量处理

function setAge(){
a=20;

}

setAge();//执行时a=20被推入全局window中执行,相当于说明了全局变量a=20

alert(a);//20

4js中没有区块作用域,在一些其他语言如java中如果有以下代码

if(true){

int age=12

}

int age只会作用于这个{ }区块中,而js中有类似代码,age不单作用于if之中,在function内都可见

function setAge(){

if(true){

var age=20;

}

}

}

5函数内部能够访问外部的变量(局部可访问全局,外部不能访问内部)当运行局部函数需要变量时,首先会查找函数内部有没有该变量,没有则会向外部查找,直到window对象也没有,抛出undfined!

var a=20;
function box(){
 var b=30;
  function set(){
	var a=40;
	console.log(a);
	console.log(b);
	}
return set();
}
box();//40,30
console.log(a);//20

 运行box()时,打印出a,由于a在函数体set()内有定义,则取出a=40;而b没有定义,b在其上一层box()内有定义,所以取得b=30

再运行console.log(a)时,由于该语句放在了box()外面执行,box()执行完毕后,它之内的变量都会被销毁.所以box()内b 以及set()内的a都销毁了,所以代码最后的

console.log(a)取得的是最外面的全局a=20;

 

转载于:https://www.cnblogs.com/luojunweb/p/7055448.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值