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访问的是全局变量。