域: 空间、范围、区域..........
作用: 在什么样的空间、范围内可以对数据进行读、写操作!
浏览器内部读取JS功能:
1)先查找声明变量、函数、参数
var a = 未定义
所有的变量,在正式运行代码之前,都是提前赋了一个值:未定义、
fn = function fn1(){};
所有的函数,在正式运行代码之前,都是整个函数.
总称:JS的预解析 当遇到重名的会只留下一个
变量和函数重名,预解析只会留下函数
当函数和函数重名,预解析只会留下最后一个函数
2)逐行解读代码:
表达式: = + - * / % ++ -- ! 参数.......
表达式可以修改预解析的值!
alert(a); //弹出 function a(){alert(4);}
var a = 1;
alert(a); //弹出 1
function a (){ alert(0); }// 不是表达式不会修改a的值,什么事不会发生
alert(a); //弹出 1
var a = 4;
alert(a); //弹出4
function a(){ alert(4); }//不是表达式不会修改a的值,什么事不会发生
alert(a); // 弹出4
a(); // 报错 预解析里保存着 a = 4; number 所以a is no function
///
var a = 1; // a =1 1)预解析: a = 未定义 fn1 = function fn1() { alert(a); var a =2; }
function fn1(){2)逐行解读代码: 函数(局部预)调用: 1)预解析: a = 未定义;
alert(a); // 未定义 2)逐行解析:a = 2;
var a = 2;
}
fn1();
alert(a); // 1
/
var a = 1;
function fn1(){
alert(a); //弹出1 函数里没有var 没有函数、参数什么都没找到,作用域链的原理由里到外返回父级找到a = 1;
a = 2; // 局部域可以修改外部变量的值
}
fn1(); 函数里加var和不加var最直接的表达
alert(a); // 所以这里弹出的结果为2
var a = 1;
function fn1(a){
alert(a); // 未定义
a = 2; // 局部里修改a = 2;
}
fn1();
alert(a); // 1 父级的a还是原来的1;
var a =1;
function fn1 (a){
alert(a); // 这里得到1 这里面的a和父级的a是不相关的
a =2; //读取到这里改为 a = 2;
}
fn1(a); // 这里调用给赋值
alert(a); // 1
//想要获取函数内的值:
1)声明一个全局变量,然后获取:
var a = '';
function fn1(){
var b = '想要的内容';
a = b;
}
fn1();
alert(a);
2)局部函数调用:
function fn2(){
var a = '想要的东西';
fn3(a);
}
fn2();
function fn3(b){
alert(a);
}
return:返回值
1)函数名+括号:fn1() ==> return 后面的值;
2)所有函数默认返回值:未定义;
3)return 后面的任何代码都不会执行!