JS学习之路(这个觉得写的很好,放在这里是方便查看)
总则-都是对象,都是引用
在接触js前用的比较多的是java,在刚开始接触js的时候,老实讲,我是有点崩溃的,相信许多像我一样从后端语言向js转的童鞋们肯定有一样的感受,这玩意儿太灵活了,好像怎么样都可以,当时简直是恨的牙痒痒.当时公司的技术总监跟我们说了一句话:学js,你只需要记住两句话,都是对象,都是引用.只要把这两句话理解透彻了,js也就没什么问题了.当时水平不行,理解不了,只能埋头看书,努力码代码.现在回头想来,还真是这么回事.
都是引用:js中的任何变量都可以”引用”任何数据类型的对象,包括基本类型和引用类型.你拿到的变量只是一个引用,赋值也是引用的传递,唯一不同的是基本类型传递的是值,引用类型传递的是地址..
都是对象:js中,你看到的一起都是对象,函数也是一个对象.
从堆栈看js:
说到基本类型和引用类型,就不得不说js中堆和栈,一图胜前言,我们来看”红宝书”中的:


从上图中可以很清楚的看到,基本数据类型保存在栈中,复制是复制值,引用类型对象保存在堆中,传递的是地址,这就是为什么我们复制后修改对象,原来对象也会变化.
作用域/作用域链:
作用域有时也叫函数执行的上下文环境,其标明函数在执行时操作哪些对象,引用哪些变量,由此又牵出作用域链的概念,如果一个变量在当前作用域没有声明,解析器会向上级作用域查询,直到找到变量的声明或者window对象下(没有就报错).这里多说一句,作用域这里比较难理解的就是this,其实也不难理解,就是谁调用这个函数,this就指向谁(引用谁),当然你要是用apply/call 逆天改变引用也是可以.
原型/原型链
原型可以简单粗暴的理解成是一个”母版”,类似印钞机的母版一样,从这个原型”复制”出来的对象都是一毛一样的.有一点不同的是,钞票印出来就跟母版没关系了,对象创建出来后还跟原型有千丝万缕的关系,简单的说,就是原型和对象之间其实是一种相互引用的关系,你可以通过对象对原型的属性(方法)进行操作(墙裂不建议这样做,简直就是作死).既然说到这里了,就不得不说对象属性,我们知道对象的原型的一个复制版,当你访问一个对象的属性(方法)时,如果这个对象上恰好没有,你们就会去访问原型上的这个属性(方法),如果还没有,(原型链来了),那就去原型的父对象(原型)上找,直到找到顶级的Object对象为止(没有就算undefined),这就是原型链.
基于js中都是引用的”法则”,你可以随意修改任意一个对象的原型(前提是你要知道你在干什么),从而赋予这个对象新的能力….
最好的解释就是看下面红宝书的图了:

闭包:
貌似很高大上的概念,本质上就是一个函数访问外部作用域的上变量,由于作用域链的存在,导致外部变量在垃圾回收该销毁的时候,因为你这个函数还在引用,无法销毁,只能继续留在内存中等你调用(也算是为这个变量逆天改命了….).
Private:
Private是java的修饰符,用来表明某个变量只有当前类可以用,其他谁都无法访问 ,那么js是不是有这样的需求呢?当然了,有时候我们需要对一些对象做private封装,不希望有其他人来修改private的代码,但是由于js的两大法则,正常情况下你一个变量我总是可以拿到引用的,拿到引用自然就可以为所欲我了.
但是,聪明的小伙伴们用闭包+自执行函数巧妙的解决了这个问题,我们可以看到许多前端框架都是这么干,其形式如(function(argu){ // doSomething})(argu);通过这自执行函数,可以向顶级对象window下挂一个变量,对外暴露一个”接口”,(出名如JQuery),而我在自执行函数内部定义的变量在函数执行完后就销毁了….,你只能按照我暴露出的接口调用方法,没有办法再去修改我的属性(方法)了….,因为闭包的存在,我的内部方法可以访问本来已经”销毁”的属性.
最后,墙裂建议有心学好js的同学看看"红宝书"--《JavaScript高级程序设计》
JS学习之路(这个觉得写的很好,放在这里是方便查看)的更多相关文章
- 【温故知新】——BABYLON.js学习之路·前辈经验(二)
前言:在上一篇随笔BABYLON.js学习之路·前辈经验(一)中回顾了组内同事们长时间在Babylon开发实践中的总结出的学习之路和经验,这一篇主要对开发中常见的一些功能点做一个梳理,这里只作为温故知 ...
- node.js学习之路
(非原创) 目录 Nodejs的介绍 15个Nodejs应用场景 Nodejs学习路线图 1. Nodejs的介绍 Node.js的是建立在Chrome的JavaScript的运行时,可方便地构建快速 ...
- JS学习之路,菜鸟总结的注意事项及错误更正
JavaScript 是一种面向对象的动态语言,它的语法来源于 Java 和 C,所以这两种语言的许多语法特性同样适 用于 JavaScript.需要注意的一个主要区别是 JavaScript 不支持 ...
- 偏前端-vue.js学习之路初级(一)概念
首先--不推荐新手直接使用 vue-cli,尤其是在你还不熟悉基于 Node.js 的构建工具时. 新建一个html,引入一下js: <!-- 开发环境版本,包含了有帮助的命令行警告 -- ...
- react.js学习之路一
今天新老大来了,我们要学习他使用的框架react.js,现在是两眼一抹黑,对于我这个前端菜鸟来说,是真正的重新开始,好了,不说那么多了,开始随便记录我的学习,之后再整理内容. (1)对于react来说 ...
- JS学习之路
前言 接触js也有四五年的时间了,对js的认识也逐渐加深,想把自己这几年学习js的经历记录一下. 总则-都是对象,都是引用 在接触js前用的比较多的是java,在刚开始接触js的时候,老实讲,我是有点 ...
- js 学习之路4:js运行/输出中文乱码问题解决
网上找了一个简单的例子,编写出来很简单,但是乱码的问题稍微困扰了一下. 题目: 1. 大马驮2石粮食,中马驮1石粮食,两头小马驮一石粮食,要用100匹马,驮100石粮食,该如何调配? js解决代码: ...
- react.js学习之路二
看react.js对我来说真的不是难不难的问题,问题是我的思路太难转变了,真是坑死我了,react里面的坑也很多.算了,这些抱怨没啥用,记录一下今天学习的内容. 今天看了to-do-list经典示例 ...
- 偏前端-vue.js学习之路初级(二)组件化构建
vue.js 组件化构建 组件系统是 Vue 的另一个重要概念,因为它是一种抽象,允许我们使用小型.自包含和通常可复用的组件构建大型应用.仔细想想,几乎任意类型的应用界面都可以抽象为一个组件树: ...
随机推荐
- c++中处理输入输出的方法
============ 怎么处理一行空格中的逗号, ,,, ,,, ,,, c,c,d,d 使用c++的方法,可以这么处理: #include <sstream> #include< ...
- Python 网络编程(二)
Python 网络编程 上一篇博客介绍了socket的基本概念以及实现了简单的TCP和UDP的客户端.服务器程序,本篇博客主要对socket编程进行更深入的讲解 一.简化版ssh实现 这是一个极其简单 ...
- vue.js组件
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- Interview
下面的题是供大家查漏补缺用的,真正的把这些题搞懂了,才能"以不变应万变". 回答问题的时候能联系做过项目的例子是最好的,有的问题后面我已经补充联系到项目中的对应的案例了. 1.简述 ...
- mysql 查询数据时按照A-Z顺序排序返回结果集
mysql 查询数据时按照A-Z顺序排序返回结果集 $sql = "SELECT * , ELT( INTERVAL( CONV( HEX( left( name, 1 ) ) , 16, ...
- 为不同版本的 Windows 编写驱动程序
MSDN原文:https://msdn.microsoft.com/zh-cn/library/windows/hardware/ff554887(v=vs.85).aspx 创建驱动程序项目时,指定 ...
- 数据库 PSU,SPU(CPU),Bundle Patches 和 Patchsets 补丁号码快速参考 (文档 ID 1922396.1)
数据库 PSU,SPU(CPU),Bundle Patches 和 Patchsets 补丁号码快速参考 (文档 ID 1922396.1)
- char、varchar、text和nchar、nvarchar、ntext的区别
1.CHAR.CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充,所以在读取的 ...
- Unity3D优化总结
1.在使用数组或ArrayList对象时应当注意 length=myArray.Length; for(int i=0;i<length;i++) { } 避免 for(int i=0;i< ...
- 学习indy组件之一idhttp的使用方法
登录 注册 百度首页 新闻 网页 贴吧 知道 音乐 图片 视频 地图 百科 文库 经验 搜索答案我要提问 首页 分类 公社 知道行家 问医生 高质量问答 经验 个人中心手机知道开放平台 关于del ...