JavaScript闭包的一点理解

JavaScript闭包是啥?闭包的英文是closure,它是函数定义时的作用域内所有变量的集合。说白了,闭包就是一个变量集、一个跟随这个函数的包裹,函数到哪儿包裹就到哪儿。

这里的作用域指的是词法作用域 (Lexical Scope)。在JavaScript中,词法作用域的意思是,函数的作用域是指函数定义时候的作用域(在定义时就决定了的),而不是执行时的作用域。

//函数定义,并未执行
function createFunction() {
   var x = 0;
   const aFunction = function() {
     x = x + 1;
     return x;
   }
   return aFunction;
}

//这三行是函数执行
const newFunction = createFunction();
const r1 = newFunction();
const r2 = newFunction();

//输出结果是1 2,而不是1 1
console.log(r1, r2);

如上代码所示,createFunction()函数中定义了一个函数并赋值给了变量aFunction,随着aFunction一起的还有一个闭包,里面有该函数用到的变量x。

在全局上下文中执行函数newFunction(),输出的r1和r2的值不一样。这里的变量x既不是全局变量,也不是局部变量,,它是一个闭包里的共用变量。闭包里保存了函数在定义时的作用域里的所有变量。

登录注册后才能评论。