变量的作用域(一)

函数运行过程中,变量的查找是由内向外逐层查找,直到window域
如没有找到则返回undefined,或者is not defined
如果是赋值操作,在没有找到的情况下,会在window域下面生成一个变量,并为之赋值,这样这个变量就会变成全局变量

添加和不添加var声明变量的比较

console.log(window.d);
conosle.log(window.e);

前两个变量d 和 e 在window 这个域里面没有这样的变量,所以返回undefined undefined

function fun(){
  d = 5;
  var e = 6;
}
fun()


通过运行fun函数, window 域下面的一个变量d被赋值,e就变成了一个函数内部的局部变量

conosle.log(window.d);  // 5
console.log(window.e);  //undefined
console.log(e);      // e is not defined


不加var 的变量通过赋值不会全部变成全局变量的

例如:

function fun1(){
  var a;
  function fun2 (){
    a = 6
    var b = 7
    c = 8
  }
  fun2()
}
fun1()
console.log(window.c)    //8
console.log(c)    //8
console.log(a)    // a is not defined 错误
console.log(b)    //如上面打印的变量a的语句不注释,这此语句不会被执行,因为JS执行特性为从上向下执行,报错后,后面的代码将不会被执行

fun2函数内部给变量a赋值为6但变量a是一个函数内部的局部变量,在全局调用的就会找不到这个变量而报错(a is not defined),声明了一个局部变量 b 值为7,在全局调用b也会找不到这个变量报错(b is not defined),变量c 在函数内部没有找到声明的局部变量,就会一直向上层搜索,一直到window,如没有找到已经声明的变量,就会在window域下面声明一个变量,并给这个变量赋值

如没有赋值操作,调用c 和 window.c的区别

var a = 1
function fun() {
  console.log(a);        // 1
  console.log(window.b);  // undefined
  console.log(b);      // b is not defined , 单独调用,则作为属性来查找,没有就会返回is not defined
}
fun();
原文地址:https://www.cnblogs.com/Hanson823/p/10212918.html