1.变量的作用域
变量的作用域分为两种
(1),全局作用域:在函数外,使用var声明变量,可以在任何作用域下访问————————————全局变量
(2),函数作用域:在函数内,使用var声明变量,只能在当前函数中访问---------------------------------------局部变量(在函数作用域中,没有用var声明的变量,是全局变量,不推荐,在严格模式中会报错)
function fn(){
var a=b=c=2;
//c=2 //没有加var
//b=c //没有加var
//var a=b //加var
}
fn();
//console.log(a);
在执行代码的时候程序是先考虑c=2 从右往左运算赋值 只需要看看这个变量有没有被声明;
(3).js程序执行前,会将var的声明的变量提升到当前作用域的最前面,而赋值去不会提升;
function fn(){
//var b
console.log(b);//undefined
var b=2;
}
fn();
在执行的时候,var b会被提升到当前这个作用域的前面,//var b
var c=3;
function fun(){
//当前作用域下没有c,会到上一级作用域寻找c
console.log(c);//3
c=5;//给全局变量c重新赋值为5
}
fun();
console.log(c);//访问的是全局的c
console.log(c)//为 5 访问的是全局变量,c=5(是全局变量)因此又重新赋值为5;
fun()的值为3 他其实访问的局部变量,由于js为解释性弱语言,当前作用域没有c变量,所以他会在上一级作用域寻找c变量。作用域链;
function add(a,b){
//形参属于局部变量,不能被外部所访问
}
add(2,3);
//console.log(a);
*/
形参属于局部变量,不能被外部所访问,
var m=5;
function foo(m){
//调用函数,实参赋值给形参,形参m就相当于局部变量
//var m=1
//往上去找m,找到的是当前作用域下的m,而不会去全局寻找
m=m+7;//在原来的基础之上加1 m+=7
}
foo(1);
//在全局作用域下,访问的就是全局的m
console.log(m);//5
实参给形参了一个值,而形参属于局部变量,所以函数体中所有的m都为局部变量,最后console。log访问的是全局变量。