js的作用域问题
一、作用域:
在js中的作用:读、写
在js中的作用:读、写
1、js代码在浏览器中的实现过程
1) "找一些东西":关键字 如 var function 参数
a = 未定义
所有的变量,在正式运行代码之前,都提前赋了一个值:未定义
fn1 = function fn1(){alert(2);}
所有的函数,在正式运行代码之前,都是整个函数块
js的预解析
遇到重用名时:只留一个
变量和函数重名时,就只留下函数,与代码出现的前后顺序无关
函数与函数重名时,则留下后出现的那个函数,与代码出现的前后顺序有关
2) 逐行解读代码:
表达式:= + - * % ++ -- ! 参数...
表达式可以修改预解析的值!包括函数
2、 js的全局变量与局部变量
1) script 可以在页面中有多个,是全局变量,全局函数
遵循自上而下的规则
2)函数内的变量是局部变量
函数调用时,内部的变量与外部的变量互不影响
遵循由里而外的规则(利用作用域链)当函数内部没有变量时,则会在函数的 外部找变量进行赋值等操作 ,在函数中进行表达式赋值时,可以将局部变量 变为全局变量
1) "找一些东西":关键字 如 var function 参数
a = 未定义
所有的变量,在正式运行代码之前,都提前赋了一个值:未定义
fn1 = function fn1(){alert(2);}
所有的函数,在正式运行代码之前,都是整个函数块
js的预解析
遇到重用名时:只留一个
变量和函数重名时,就只留下函数,与代码出现的前后顺序无关
函数与函数重名时,则留下后出现的那个函数,与代码出现的前后顺序有关
2) 逐行解读代码:
表达式:= + - * % ++ -- ! 参数...
表达式可以修改预解析的值!包括函数
2、 js的全局变量与局部变量
1) script 可以在页面中有多个,是全局变量,全局函数
遵循自上而下的规则
2)函数内的变量是局部变量
函数调用时,内部的变量与外部的变量互不影响
遵循由里而外的规则(利用作用域链)当函数内部没有变量时,则会在函数的 外部找变量进行赋值等操作 ,在函数中进行表达式赋值时,可以将局部变量 变为全局变量
3、典型代码实例:
1)代码如下:
alert(a); //返回值function a(){ alert(4);
//此时js预解析库里存放的就只有 a = function a(){ alert(4);
var a = 1; //表达式将a的值进行修改 改写为1
alert(a); //1
function a(){alert(2);}
alert(a); //2
var a = 3; //表达式将a的值进行修改 改写为3
alert(a); //3
function a(){ alert(4);}
alert(a); //3
//此时js预解析库里存放的就只有a = 3
//此时js预解析库里存放的就只有 a = function a(){ alert(4);
var a = 1; //表达式将a的值进行修改 改写为1
alert(a); //1
function a(){alert(2);}
alert(a); //2
var a = 3; //表达式将a的值进行修改 改写为3
alert(a); //3
function a(){ alert(4);}
alert(a); //3
//此时js预解析库里存放的就只有a = 3
2)代码如下:
var a = 1;
function fn1(){
alert(a);//undefined
var a = 2;
}
fn1();
alert(a);//1
var a = 1;
function fn1(){
alert(a);//1
a = 2;
}
fn1();
alert(a);//2
function fn1(){
alert(a);//undefined
var a = 2;
}
fn1();
alert(a);//1
var a = 1;
function fn1(){
alert(a);//1
a = 2;
}
fn1();
alert(a);//2
var a = 1;
function fn1(a){
alert(a); //undefined
var a = 2;
}
fn1();
alert(a); //1
var a = 1;
function fn1(a){ //传入参数var a = 1
alert(a); //1
var a = 2;
}
fn1(a);
alert(a); //1 函数内的变量改变不会影响外部的改变
function fn1(a){
alert(a); //undefined
var a = 2;
}
fn1();
alert(a); //1
var a = 1;
function fn1(a){ //传入参数var a = 1
alert(a); //1
var a = 2;
}
fn1(a);
alert(a); //1 函数内的变量改变不会影响外部的改变
注意:此文章中文字部分红色为重点部分,颜色越深越重点,代码部分,红色为需要注意的部分,需要多加理解的部分。