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';
}
};
}