JavaScript作用域详解

JavaScrip作用域的概念
作用域是可访问的变量的集合。在JavaScript中,作用域为可访问变量,对象,函数的集合,它分为局部作用域和全局作用域。

局部作用域:变量在函数内部声明为局部作用域,局部变量只作用于函数内,不同的函数可以使用相同名称的变量,它只能在函数内部访问。局部变量在函数开始执行时创建,函数执行完成后局部变量会自动销毁。

全局作用域:变量在函数外定义为全局变量,网页中的所有脚本和函数均可使用。
注:若变量在函数内部没有声明(未使用var关键字),该变量为全局变量。
域解析
浏览器读js的解析器,当进入script标签后:
第1步–预解析:找到全局的var和function(变量提升),先检查function函数名和内容并储存,当发现重名时,后面的函数覆盖前面的函数;再检查var变量的值并设置undefind,但是发现重名时会自动跳过(包括变量名与函数名相同)
第2步–逐行读代码:在变量在赋值之前值一直是undefind,除非读到=、+、-、*、/、%、++、–、!等表达式,而逐行读到函数时则什么都不会做,直到函数被调用才会执行其内容代码
作用域链
作用域链:在一个域内没有找到某变量时,会由里到外,自上到下去更高级的域中去寻找。
典型的面试题
1.var a = 10; function aaa(){ alert(a); } function bbb(){ var a = 20; aaa(); } bbb();//弹出结果为10;
调用bbb()函数,依次执行代码,读到aaa()时调用aaa函数,aaa函数里没有变量a,从里到外寻找,找到全局中的a

2.var a = 10; function aaa(a){//a是形参,优先级高于函数内部的var a,所以局部变量a的声明被忽略了 alert(a); var a = 20; } aaa(a);//输出结果为10;

3.给未声明的变量赋值,此变量会变成全局变量。
如var a = b = 10;
b = 10,且 b为全局变量, a = b且a为局部变量

4.变量修改的时候另一个变量也会跟着变化,但是重新定义时另一个不会变化`
var a = [1,2,3];
var b = a ;
b.push(4);
alert(a);//结果为[1,2,3,4];

b重新赋值是a不会改变
var a = [1,2,3,];
var b = a;
b = [1,2,3,4]
alert(a);
//结果为[1,2,3];`
5.alert(a); //function a(){alert(4)}
var a=1;
alert(a); //1
function a(){
alert(2);
}
alert(a); //1
var a = 3;
alert(a); //3
function a(){
alert(4); //3
}
alert(a); //1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值