JavaScript原型与闭包相关
1什么是对象
js中的值分为引用值和原始值
原始值:undefined null Boolean string number 原始值无法更改 存放在栈中
引用值:Array Object Function 引用值可更改 指向引用值的指针存放在栈中 数据存放在堆中 当相互赋值时 只是把栈中的指针赋给对方
对象:一切引用类型都是对象,对象是属性的集合
对象都是通过函数创建的 函数都是对象
语法糖:指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。
2. 原型 -- prototype
js函数的默认属性 -- prototype 属性值为一个对象 对象中仅包含constructor constructor指向函数本身
Object.prototypt
3.隐式原型 -- __proto__
对象有个默认的属性 __proto__ 他绝对等于创建他的函数的prototype
即function a () {}
var b = new a();
b.__proto__ === a.prototype
obj.__proto === Object.prototype
图示
特例
Object.prototype也是个对象 但是他的__proto__ 为null;
另外:__proto__是原型访问器。目前原型访问器,有3类:标准原型访问器Object.getPrototypeOf(object);该访问器,火狐和谷歌差不多都支持。其次,是非标准访问器object.__proto__,对的就是你正在使用的这个,这个访问器,IE不支持,估计也还有其他基于IE内核的浏览器也不支持,所以并不是每一个对象都有它。最后就是通用访问器,object.constructor.prototype去得到原型。
原型链完整图
有待进一步理解
4.typeof() .. instanceof ..
typeof()是可以判断括号中参数的类型 但只限于原始类型 在引用类型中 他只返回function/object
A instanceof B 则表示一种继承关系 规则为
沿着A的__proto__这条线来找,同时沿着B的prototype这条线来找,如果两条线能找到同一个引用,即同一个对象,那么就返回true。如果找到终点还未重合,则返回false。
5.原型链
访问一个对象的属性时,先在基本属性中查找,如果没有,再沿着__proto__这条链向上找,这就是原型链。
fn.hasOwnPrototype(item) 可以判断item是fn本身的 还是fn原型链上的 来自Object.prototype的属性
call apply等来自js提供的Function.prototype中
6.执行上下文
全局变量下:
变量/函数表达式 -- 提前声明 undefined
函数声明 -- 提前声明 并赋值
this -- 赋值
函数下:
在函数声明的时候,内部的自由变量等就已经确定了其作用域 函数每被调用一次,都会生成一个新的执行上下文
7.this的指向
this指向调用该函数的对象
注意
当一个函数被call和apply调用时,this的值就取传入的对象的值
这种情况下函数f的this仍为window
8.执行上下文栈
处于活动状态的执行上下文环境只有一个。
其实这是一个压栈出栈的过程——执行上下文栈
9.作用域
javascript除了全局作用域之外,只有函数可以创建的作用域。
我们在声明变量时,全局代码要在代码前端声明,函数中要在函数体一开始就声明好。除了这两个地方,其他地方都不要出现变量声明。而且建议用“单var”形式
作用域最大的用处就是隔离变量,不同作用域下同名变量不会有冲突
作用域只是一个“地盘”,一个抽象的概念,其中没有变量。要通过作用域对应的执行上下文环境来获取变量的值
作用域中变量的值是在执行过程中产生的确定的,而作用域却是在函数创建时就确定了。
如果要查找一个作用域下某个变量的值,就需要找到这个作用域对应的执行上下文环境,再在其中寻找变量的值。
作用域是静态的组织结构,上下文是动态的计算。
10.自由变量
在A作用域中使用的变量x,却没有在A作用域中声明(即在其他作用域中声明的),对于A作用域来说,x就是一个自由变量。
自由变量要到创建这个函数的那个作用域中取值——是“创建”,而不是“调用”
11.作用域链
12.闭包
闭包应用的两种情况:
函数作为返回值,函数作为参数传递。
使用闭包会增加内容开销
笔记总结来源http://www.cnblogs.com/wangfupeng1988/p/4001284.html
大佬写的很棒
JavaScript原型与闭包相关的更多相关文章
- 深入理解javascript原型和闭包系列
从下面目录中可以看到,本系列有16篇文章,外加两篇后补的,一共18篇文章.写了半个月,从9月17号开始写的.每篇文章更新时,读者的反馈还是可以的,虽然不至于上头条,但是也算是中规中矩,有看的人,也有评 ...
- 《深入理解javascript原型和闭包系列》 知识点整理(转)
深入理解javascript原型和闭包系列 对原型和闭包等相关知识的讲解,由浅入深,通俗易懂,每个字都值得细细研究. 一.一切都是对象 1. typeof操作符输出6种类型:string boolea ...
- 《深入理解javascript原型和闭包系列》 知识点整理
深入理解javascript原型和闭包系列 对原型和闭包等相关知识的讲解,由浅入深,通俗易懂,每个字都值得细细研究. 一.一切都是对象 1. typeof操作符输出6种类型:string boolea ...
- 转:深入理解javascript原型和闭包系列
转自:深入理解javascript原型和闭包系列 从下面目录中可以看到,本系列有16篇文章,外加两篇后补的,一共18篇文章.写了半个月,从9月17号开始写的.每篇文章更新时,读者的反馈还是可以的,虽然 ...
- 深入理解javascript原型和闭包 (转)
该教程绕开了javascript的一些基本的语法知识,直接讲解javascript中最难理解的两个部分,也是和其他主流面向对象语言区别最大的两个部分--原型和闭包,当然,肯定少不了原型链和作用域链.帮 ...
- 深入理解javascript原型和闭包(1)——一切都是对象
“一切都是对象”这句话的重点在于如何去理解“对象”这个概念. ——当然,也不是所有的都是对象,值类型就不是对象. 首先咱们还是先看看javascript中一个常用的函数——typeof().typeo ...
- 深入理解javascript原型和闭包(2)——函数和对象的关系
上文(理解javascript原型和作用域系列(1)——一切都是对象)已经提到,函数就是对象的一种,因为通过instanceof函数可以判断. var fn = function () { }; co ...
- 深入理解javascript原型和闭包(3)——prototype原型
既typeof之后的另一位老朋友! prototype也是我们的老朋友,即使不了解的人,也应该都听过它的大名.如果它还是您的新朋友,我估计您也是javascript的新朋友. 在咱们的第一节(深入理解 ...
- 深入理解javascript原型和闭包(4)——隐式原型
注意:本文不是javascript基础教程,如果你没有接触过原型的基本知识,应该先去了解一下,推荐看<javascript高级程序设计(第三版)>第6章:面向对象的程序设计. 上节已经提到 ...
随机推荐
- Openstack-Namespaces
介绍OpenStack neutron使用Linux网络命名空间来避免物理网络和虚拟网络间的冲突,或者不同虚拟网络间的冲突. 网络命名空间就是一个独立的网络协议栈,它有自己的网络接口,路由,以及防火墙 ...
- DataCommand和DataAdapter
SqlDataReader 高效,功能弱,只读访问SqlDataAdapter 强大,要求资源也大一点 SqlDataReader 只能在保持跟数据库连接的状态下才可以读取... SqlDataAda ...
- 连接redis错误:ERR Client sent AUTH, but no password is set
问题原因:没有设置redis的密码 解决:命令行进入Redis的文件夹: D:\Redis-x64-3.2.100>redis-cli.exe 查看是否设置了密码: 127.0.0.1:6379 ...
- Excel实现年会座位查询
年终了,各公司都在搞年会或尾牙,大公司的年会参与人数都是成千上万的,每个人都想知道自已的座位,实现的方式有很多,有用公众号查询的,有用网页查询的,今天介绍的是本公司用的Excel的实现方式,如下图. ...
- 在python中使用正则表达式
一.转义符 1.在python中的转义符 (1)\\n与\n的区别 (2)r"\next" 通过r来进行转义 (3)"\\\\d"与"\\d" ...
- CSS 内边距 外边距
CSS 内边距 外边距 <html> <!-- style="margin: 0 auto" 将网页上方空白边距填满--> <body style=& ...
- Docker Compose 一键部署Nginx代理Tomcat集群
Docker Compose 一键部署Nginx代理Tomcat集群 目录结构 [root@localhost ~]# tree compose_nginx_tomcat/ compose_nginx ...
- 剑指offer(53)表示数值的字符串
题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2","-123","3.1 ...
- 【Visual Studio 扩展工具】如何在ComponentOneFlexGrid树中显示RadioButton
概述 在ComponentOne Enterprise .NET控件集中,FlexGrid表格控件是用户使用频率最高的控件之一.它是一个功能强大的数据管理工具,轻盈且灵动,以分层的形式展示数据(数据呈 ...
- @JsonSerialize的使用
实际开发中,我们一定遇到过这样的问题:前端显示和后台存储数据单位不统一,而且各有各自的理由,统一不了,那就转换吧. 每次返回给前端时再转换一遍,返回给前端的json数据,在后端里定义的往往是一个对象, ...