JavaScript面向对象学习笔记——闭包
来源:互联网 发布:php exec执行失败 编辑:程序博客网 时间:2024/05/20 13:17
作用域
JavaScript不存在大括号级的作用域,但是有函数作用域,在函数内定义的变量在函数外是不可见的,但是该变量在某个代码块中定义(比如if或者for语句中),它在代码块外是可见的。
var a = 1;function f(){var b = 1;return a;}
这里变量a是属于全局域的,变量b的作用域就在函数f()内了,所以在f()内a和b都是可见的,在f()外a是可见的,b是不可见的。
如果在函数f()中定义了另一个函数n(),那么在n()中可以访问的变量既可以来自它自身的作用域,也可以来自其父级的作用域,这就形成了一条作用域链,该链的长度取决于实际的需要。
var a = 1;function f(){ var b = 1; function n(){ var c =3; }}
词法作用域
JavaScript中每个函数都有一个自己的词法作用域,每个函数在被定义时而不是执行时都会创建一个属于自己的环境即作用域;
function f1(){var a = 1;f2();}function f2(){return a;}f1();
在函数f1()中调用了函数f2(),由于局部变量a也在f1()中,但是f2()是不可以访问a的,因为当f2()被定义时不是被执行时,变量a是不可见的。和f1()一样,它那时候只能访问自身作用域和全局作用域中的内容,也就是说,这里的f1()、f2()之间不存在共享的词法作用域。尽管当函数被定义时它会记录自身所在环境和相关的作用域链,但是这并不意味着函数也会对其作用域中的每个变量进行记录,正好相反,可以在函数中对变量执行添加、移除和更新,函数只会看到该变量的最终状态。另外,即使f2()还没有被定义,也可以在f1()的定义中包含对f2()的调用,因为对f1()而言,其所知的作用域的任何东西都是可用的。
利用闭包突破作用域链
首先是全局作用域,可以看作是包含一切的宇宙
其中可以包含各种变量比如a和函数比如f
每个函数也都有一块属于自己的私有空间,用于存储一些别的变量和函数,所以:
假如在图中的a点,那么就是位于全局空间中,如果是在b点,就是子啊函数F的空间里,在这里既可以访问全局空间也可以访问F空间,如果是在c点,那就是位于函数N中,在这里可以访问的空间包括全局空间、F空间和N空间。其中,a和b之间是不联通的,因为b在F外是不可见的,但是,b和c是可以连通的,或者说N和b可以连通,当把N的空间扩展到F外,并止步于全局空间以内时,就产生闭包。
- JavaScript面向对象学习笔记——闭包
- JavaScript学习笔记——面向对象编程(OOP)
- javascript面向对象学习笔记(一)——属性
- javascript面向对象学习笔记(三)——继承
- javascript面向对象学习笔记(五)——模块化
- JavaScript入门学习笔记(3)—— 面向对象
- javascript面向对象学习笔记
- javaScript 面向对象-闭包
- java笔记——面向对象包
- JavaScript面向对象(2)——函数与闭包(函数、对象、闭包)
- JavaScript学习(三)面向对象、闭包、原型
- 学习笔记:JavaScript——闭包
- 《JavaScript面向对象精要》— 笔记
- 闭包 Scala学习笔记-面向对象篇
- 【学习笔记19】java面向对象-包
- javascript面向对象学习笔记(二)——创建对象
- javascript面向对象学习笔记2010.7.16
- JavaScript 学习笔记十三 面向对象?
- Android中SharedPreferences的使用
- 高德地图,百度地图等坐标体系,坐标转换
- windows下生成Python可执行程序
- 事物的特性
- 使用Navicat for Oracle工具连接oracle的图文教程
- JavaScript面向对象学习笔记——闭包
- 《C和指针》:存储类型
- Gson解析null替换为空字符串
- oracle基础--更改表定义
- php数组中的索引数组和关联数组
- NIO通讯库的设计
- Xamarin XAML语言教程使用Visual Studio创建XAML
- [Navicat] 连接Oracle报错_Cannot load OCI DLL 87
- JavaScript编程风格