- 理解 Javascript 的闭包
- 学习Javascript闭包(Closure)
- javascript的闭包
- JavaScript 闭包深入理解理解 Javascript 的闭包
- JavaScript 中的闭包
闭包是什么
闭包就是能够读取其他函数内部变量的函数。—— 阮一峰
在JavaScript中,函数A内部的局部变量不能被A以外的函数访问到,只能被A内部的子函数B访问到,当在函数A外调用函数B时,便可通过B访问A中局部变量,那么子函数B就是闭包。(注意,是子函数哦~)
举个栗子:
function outer() {
var a = 100; // outer的局部变量
function inner() {
// 闭包
console.log(a);
}
return inner; // 没有这条语句,闭包起不到在outer外部访问变量a的作用~
}
console.log(a); // 在外部直接访问a出错,Uncaught ReferenceError: a is not defined
var test = outer(); // outer运行完返回inner,赋值给test
test(); // 100,执行test(),相当于执行inner(),这样就可以访问到outer内部的a了
简单来说,闭包就是在另一个作用域中保存了一份它从上一级函数或作用域取得的变量(键值对),而这些键值对是不会随上一级函数的执行完成而销毁。周爱民说得更清楚,闭包就是“属性表”,闭包就是一个数据块,闭包就是一个存放着“Name=Value”的对照表。就这么简单。但是,必须强调,闭包是一个运行期概念。—— 司徒正美
闭包的原理
根编译原理知识,编程语言主要分为两类:
{
"编译形": c/c++,
"解释形": javascript
}
“编译形(C/C++、java )” 是全部代码必须整体正确通过编译后才可以运行.。[代码整体为单位完全编译]、[先编译后运行]
“解释形(javascript)”是一边编译一边运行,代码是逐行解释运行。[代码按最小单位:表达式|语句解释运行]、[编译运行先同时]
说原理可能有些大,但这部分确实是要从内部机制的角度,解释下“为什么上面的栗子中通过inner就可以在outer外部访问outer内部的a
javascript是没有块级作用域的 但是具有全局作用和函数内部运行时作用域
在JS中,有两个链很重要:原型链 和 作用域链。通过 原型链 可以实现继承,而与