JavaScript作用域链

1.变量作用域

变量的作用域:全局变量局部变量
在JavaScript中:函数内部可以直接读取全局变量,但是在函数外部无法读取函数内部的局部变量。注意:在函数内部声明变量时,要使用var命令。如果不用,实际上声明的是一个全局变量!

2.全局作用域链

先看一个例子:

var a = 123;
    fn(a);
function fn(a){
    a = 456;
}
console.log(a); //123

运行过程分析:
1.声明变量a,并且赋值a=123;
2.将a传递到fn(a)并且执行function,在function内的a赋值为456;
3.输出a的值为123。

原理解释:
var a = 123,是在全局作用域下声明的,与局部变量中的a并非同一个变量,function fn(a){ }中的a相当于声明了在局部作用域中的一个变量a,外部环境实际上是无法直接访问内部声明的变量a的,所以位于全局作用域下的console.log(a)会去找全局作用域下声明的a,即a = 123 ,所以最后输出值为123。

执行逻辑:
每当执行一个函数,就进入了一个新的作用域下,找变量先从自己的作用域下找,如果找不到就到上一层(当前函数声明的作用域)的作用域下寻找,直到找到为止。(如果在全局作用域下仍未找到,就是undefined)

3.闭包的概念

function f1(){
    var n=999;
    function f2(){
      alert(n); // 999
    }
  }

代码中的f2函数,就是闭包。

闭包就是能够读取其他函数内部变量的函数。例如在javascript中,只有函数内部的子函数才能读取局部变量,所以闭包可以理解成“定义在一个函数内部的函数“。在本质上,闭包是将函数内部和函数外部连接起来的桥梁。(闭包就是能够读取其他函数内部变量的函数。)

4.函数的参数传递

function inc(n){
  n++;
}
var a = 10;
inc(a);
console.log(a) //10

上面代码相当于:

function inc(n){
  var n = arguments[0];
  n++;
}
var a = 10;
inc(a);
console.log(a) //10

执行步骤:
声明一个变量n,值为arguments[0],inc(a)即是将a的值传递给arguments,即function inc(){}里面的n = 10,n++,但是与a的值并无关联,所以a的值并未改变,仍然是10。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容