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

 

posted on 2020-06-09 20:54  F_Hark  阅读(133)  评论(0编辑  收藏  举报