day08-作用域

var a = 1;
function fn1(a){
alert(a); //1
a = 2;
}
fn1(a);
alert(a);               //1

a=undefined;
fn1=function fn1(a){ alert(a);a=2;}
a=undefined;  --> a=1;  //这是全局变量的a
函数里的预解析:
  因为函数里有参数,所以a=undefined    //这是局部变量的a
函数里的逐行执行代码:
  从function关键字那里开始执行,参数本身是一个局部变量,所以相当于function fn1(var a;) 又因为全局的a=1传进来了,所以a=1,全局变量的值改了局部变量的值

  执行"a=2"; 修改的是局部变量中的a,而不是全局的。遵循"就近原则"



第一种:需求:通过鼠标点击执行函数,让num的值发生变化。 因为num在函数内没找到,进而找父级的,修改父级。(局部可以改全局)
var num = 0;
function fn1(){
num++;         
}
fn1();

第二种:全局变量,任何函数都可以改它。函数内没有该变量,则从父级中找。若父级中有该变量则改写其值,若没有则会报错
var num = 0;
function fn1(){
num++;         
}
function fn2(){
num--;
}

fn2();          //num=-1
fn1();          //num=0
fn2();          //num=-1
alert(num);     //num=-1


第三种:函数里声明一个变量
function fn1(){
var a = '大鸡腿~';
}
fn1();
alert(a);           //会报错,a is no defined   预解析过程中没找到全局变量a


// 想要获取函数内的值:  1、局部改全局
var str = '';
function fn1(){
var a = '大鸡腿~';
str = a;
}
fn1();
alert( str );      //大鸡腿~

-----------------------
局部的函数调用把值传出来
function fn2(){                                                             -----第x行
var a = '9999999克拉钻石23456789';                 -----第x+1行
fn3(a);                                                                 -----第x+2行
}                                                                                   
fn2();                                                                           -----第x+4行
function fn3(a){    //这里的a为函数fn3的局部变量      -----第x+5行
alert(a);                                                               -----第x+6行
}

执行过程:

预解析:

 fn2=function fn2(){var a = '9999999克拉钻石23456789';fn3(a);  }

 fn3=function fn3(a){alert(a); }

 逐行解读代码:

 执行第x+4行的函数调用(也属于表达式的一种),因为函数也是一种域,所以也要执行"预解析"和"逐行代码解读"过程,所以在名为fn2的小仓库中预解析为:var a=undefined,然后逐行解析代码:

所以a= '9999999克拉钻石23456789',找到第x+2行的"fn3(a)",解析器会先找到"fn3"(像函数的样子),所以现在函数fn2的仓库里找,找不到则到全局的预定义里找,找到了,所以然后在对函数进行预解析、逐行解读代码

所以最终结果:第x+6行弹出a的值为9999999克拉钻石23456789


-----------------------------------------




判断if的{}里面是不是作用域。作用域的判断条件是先进行预解析,在逐行解析代码。

作用域的例子:
alert(a);              //a is no defined    报错
function fn1(){
var a=1;
}

不是作用域的例子:if{} 、for{}、while{}
如果弹出的a值为undefined,则说明if的{}里面不是作用域;如果报错即a is no defined,则说明if的{}里面是作用域
alert( a);  //undefined
if(true){
var a = 1;
}

-----------------------------------

不同浏览器存在兼容问题。如火狐和各大浏览器的兼容

// alert(a); // undefined
alert( fn1 ); // FF(火狐) 浏览器不能对下面的函数进行预解析。正常的是弹出下面整个函数块,而火狐浏览器则报错 fn1 is no defined

if( true ){
var a = 1;
function fn1(){
alert(123);
}

}

上面做的无非是定义全局变量和全局函数,可以使用以下:

var a = 1;
function fn1(){
alert(123);
}

if( true ){
alert( fn1 );
}

不要随便往if语句里面定义全局变量和全局函数



-------------------------------------------------------


for循环里面的function不要直接使用其初始条件var i=0,会出现问题的


--------------------------------------------------

第一种情况:
for( var i=0; i<3; i++ ){
aBtn[i].onclick = function (){                     
alert( i ); // 3  这里的i指函数在预解析,逐行解析代码后i在小仓库里找不到,从全局仓库中找到的i为3
};
}

第二情况:
for( var i=0; i<3; i++ ){
aBtn[i].onclick = function (){                     
alert( i ); // undefined  因为在函数下面for条件里定义了一个局部全局变量i,先在小仓库里找到预解析为undefined
for( var i=0; i<3; i++ ){
aBtn[i].style.background = 'yellow';
}
};
}

第三种情况:
for( var i=0; i<3; i++ ){
aBtn[i].onclick = function (){                     
alert( i ); // 3  因为先在小仓库里没找到i,从大仓库里找的
for(i=0; i<3; i++ ){          //这里没有var
aBtn[i].style.background = 'yellow';
}
};
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值