js作用域与作用域链自己的理解

作用域:使用范围

全局变量 :即用var定义的除了在函数中不可使用,在其他地方都可使用的变量
局部变量:只能在函数内使用,在函数外部便访问不到

  function fn(){
            var num=1;
            console.log(num)
        }
        fn()
        console.log(num) //报错未定义

块级作用域:一个大括号就能看做一块,在这里面定义的变量外部不可访问,但是在js中在这块级作用域中定义的变量外部也能访问(在js中没有块级作用域只有函数除外)

隐式全局变量:声明变量没有用var 这个变量叫做隐式全局变量
用var生成的全局变量是不会被删除的,但是隐式全局变量可被删除

//    var num1=10;
//    num2=20;
//    delete num1;//把num1删除了
//    delete num2;//把num2删除了
//    console.log(typeof num1);
//    console.log(num1+10);
//    console.log(typeof num2); 此时为undefined

有趣的事:当函数内部定义的变量的名称与函数外部全局变量的名称一样时函数内部的变量会变量提升第一次scop输出undefined 第二次输出local

    var scope = "global";
      function fn(){
         console.log(scope);//result:undefined
         var scope = "local";
         console.log(scope);//result:local;
      }
      fn();

再看一下这个代码:这就是变量提升后的效果所以在变量命名时要特别注意

  var scope = "global";
      function fn(){
        var scope;
         console.log(scope);//result:undefined
         scope = "local";
         console.log(scope);//result:local;
      }
      fn();

js函数执行环境:
每个函数执行后都会产生一个执行环境,并为这个执行环境链接一个对象,且环境中所有定义的变量和函数都保存在这个对象中.
全局执行环境是最外围的执行环境,全局执行环境被认为是window对象,因此所有的全局变量和函数都作为window对象的属性和方法创建的。
js函数的执行时根据函数调用所决定的。当一个函数被调用时,该函数环境的变量对象就被压入一个环境栈中。而在函数执行之后,栈将该函数的变量对象弹出,把控制权交给之前的执行环境变量对象。
举个例子:

		var scope="objWindow"
			function fn1(){
			return scope
			}
			function fn2(){
			return scope
			}
			fn1();
			fn2();

js作用域与作用域链自己的理解_第1张图片
自由变量:
当前作用域想获取a的值发现没有:如下代码所示 : 当前作用域没有定义的值且想要获取 那么这个值就叫自由变量 如何获取–>向父级作用域寻找直到找到。


var a = 100
function fn() {
    var b = 200
    console.log(a) // 这里的a在这里就是一个自由变量
    console.log(b)
}

作用域链:
获取自由变量获取不到就会一直像上层作用域寻找直到找到—》这条寻找自由变量的链子就叫做作用域链。

你可能感兴趣的:(js作用域与作用域链自己的理解)