L1 - 闭包和原型链
先来一炮尝尝:
var i = 10;
function myFunc(){
var i = 20;
function innerFunc(){
alert(i);
}
return innerFunc;
}
var func = myFunc();
func();
此栗为什么弹出20,而不是10?为什么定义在 myFunc 内部的 innerFunc 返回了以后,还能访问到 myFunc 内部的变量 i ?
这是因为在 innerFunc 返回了以后,仍然保留着函数运行的实例、执行环境和作用域链等等,并在 myFunc 调用之后没有将函数实例丢弃,因此在调用 innerfunc 的时候能够引用到 myfunc 中声明的 i ,这就是闭包的特性,其实上面的栗子就是一个闭包。
作用域链是一个链状的数据结构。作用域就是对上下文数据的描述。闭包和作用域链是紧密联系的,函数实例执行时的闭包是构成作用域链的基本元素。javascript代码在执行前会进行语法分析(详见L1 - 运行机制),在语法分析阶段,会记录全局环境中的变量声明和函数定义,构造函数的调用对象(也叫 active object、活动对象)和在全局环境下的作用域链。
《javascript权威指南》(第四版)对“调用对象”做出了三点说明:
1、对象属性和变量没有本质区别
2、全局变量其实是“全局对象(global object)“的属性
3、局部变量其实是”调用对象(call object)“的属性
为了解释上述话题,《javascript权威指南》引入了”javascript执行环境(执行上下文、execution context)的概念“。这其中所说到的“全局对象(global object)“和”调用对象(call object)“其实都是指下图中的 ScriptObject 结构。

上图是《JavaScript语言精髓和编程实践》中对闭包相关元素的内部数据结构的描述,其中的 ScriptObject 是对调用对象的一种描述。 ScriptObject 在语法分析阶段就已经构造好了,其中的 varDecls 保存着函数中的变量声明,funDecls保存着内部的函数声明。
在上篇《执行机制》中已经讲过,在语法分析阶段,varDecls 中保存着在函数中用var进行显示声明的局部变量,并且其值默认为 undefined ;而发现有函数定义时,除了记录函数声明,还会创建一个函数对象,并把当前的作用域链赋值给此函数对象的 [[scope]] 属性(这个属性是javascript引擎内部维护的,但Firefox可通过私有属性parent访问它)。这就是为什么在《javascript权威指南》中提到”javascript中的函数运行在它们被定义的作用域中,而不是运行在它们被执行的作用域中“。
再来一炮:(未完待续)
L1 - 闭包和原型链的更多相关文章
- jquery学习笔记---闭包,原型链,this关键字
网上的资料很多,关于闭包,原型链,面向对象之内的.本人也有一点自己的总结. 关于this: this 的值取决于 function 被调用的方式,一共有四种, 如果一个 function 是一个对象的 ...
- 几句话就能让你理解:this、闭包、原型链
以下是个人对这三个老大难的总结(最近一直在学习原生JS,翻了不少书,不少文档,虽然还是新手,但我会继续坚持走我自己的路) 原型链 所有对象都是基于Object.prototype,Object.pro ...
- JAVASCRIPT闭包以及原型链
方法内部还有个方法,实例化父方法后,再次调用父方法,可以运行父方法内部的子方法,这样的程序就叫做闭包 DEMO如下: //function outerFn() { // var outerVar = ...
- 在学习java之余,js的使用精髓-闭包和原型链
这里分享下廖雪峰官网写的js教程,内容写的比较实用,易懂,其中简介的原型链和闭包的知识,小伙伴们一起上呀,畅游在知识的海洋中: 地址:https://www.liaoxuefeng.com/wiki/ ...
- js学习笔记之自调用函数、闭包、原型链
自调用函数 var name = 'world!'; // console.log(typeof name) (function () { console.log(this.name, name, ...
- Vue之JavaScript基础(闭包与原型链)
闭包 定义:能够访问另一个函数作用域的变量的函数. 作用:可以通过闭包,设计私有变量及方法 实例: function outer() { var a = '变量1' var inner = funct ...
- js闭包和原型链好文
http://www.cnblogs.com/wangfupeng1988/p/3977924.html
- es6之后,真的不需要知道原型链了吗?
3月份几乎每天都能看到面试的人从我身边经过,前段时间同事聊面试话题提到了原型链,顿时激起了我在开始学习前端时很多心酸的回忆.第一次接触js的面向对象思想是在读<js高程设计>(红宝书)的时 ...
- Js中关于构造函数,原型,原型链深入理解
在 ES6之前,在Javascript不存在类(Class)的概念,javascript中不是基于类的,而是通过构造函数(constructor)和原型链(prototype chains)实现的.但 ...
随机推荐
- ssh免密码登陆及其原理
ssh 无密码登录要使用公钥与私钥.linux下可以用用ssh-keygen生成公钥/私钥对,下面我以CentOS为例. 有机器A(192.168.1.155),B(192.168.1.181).现想 ...
- Android 新手引导
关于这个Demo的写法很多 我也献上一段 效果图如下 上代码 MainActivity public class MainActivity extends Activity { // public L ...
- golang chan 超时
golang chan 超时 Posted on 2013-12-24 13:03 oathleo 阅读(4227) 评论(0) 编辑 收藏 package main import ( &q ...
- 百度地图-marker拖拉,右键菜单
marker拖拉,修改经纬度. //创建Map实例 var map = new BMap.Map("allmap"); var point=new BMap.Point(104.0 ...
- J2EE 第二阶段项目之编写代码(三)
我的任务就是项目统计. 1 效益统计 1 教育效益统计表 (教育效益统计表,增,改,查看,查) 2 农牧林效益统计表 (农牧林效益统计表,增,改,查看,查) 3 乡村效益统计表 (乡村效益统计表 ...
- samba服务器常用指令
samba服务器需要安装samba.samba-common.samba-client三个包: samba -----samba服务器程序的所有文件 samba-common -----提供了Samb ...
- PHP工程师突破
身边有几个做PHP开发的朋友,因为面试,也接触到不少的PHP工程师,他们常疑虑自己将来在技术上的成长与发展,我常给他们一些建议,希望他们能破突自己,有更好的发展. PHP工程师面临成长瓶颈 先明确我所 ...
- 快速开始使用Graph-tool - gt文件格式
gt文件格式 gt文件格式是一种简单的二进制格式,用来存储graph-tool的图实例,以一个紧凑和快速的方式,包括了库支持所有类型的属性映射. 它是graphml格式(基于文本)的另一种选择,gra ...
- centos7 安装mariaDB 以及 phpmyadmin的安装
centos7 安装mariaDB 以及 phpmyadmin的安装 一:安装mariadb, mariadb 是 mysql 的一个分支,基本和mysql一样的 1. yum -y install ...
- MIRO校验过程
一.介绍发票校验是物料管理(MM)系统的一部分.它提供物料管理部分和财务会计, 成本控制和资产管理部分的连接.物料管理模块的发票校验为以下目的服务:它完成物料采购的全过程 - 物料采购从采购申请开始, ...