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 的另一个重要概念,因为它是一种抽象,允许我们使用小型.自包含和通常可复用的组件构建大型应用.仔细想想,几乎任意类型的应用界面都可以抽象为一个组件树: ...
随机推荐
- Code Page 编码
Identifier .NET Name Additional information 037 IBM037 IBM EBCDIC US-Canada 437 IBM437 OEM United St ...
- 基于Redis、Storm的实时数据查询实践
通过算法小组给出的聚合文件,我们需要实现一种业务场景,通过用户的消费地点的商户ID与posId,查询出他所在的商圈,并通过商圈地点查询出与该区域的做活动的商户,并与之进行消息匹配,推送相应活动信息到用 ...
- POJ 2528 Mayor's posters(线段树+离散化)
Mayor's posters 转载自:http://blog.csdn.net/winddreams/article/details/38443761 [题目链接]Mayor's posters [ ...
- linux命令按文件内容查找文件
[root@hn web]# find /app/code/hzg/web/ -type f -name "*.php" | xargs grep "slog"
- 动画--问题追踪:ImageView执行缩放动画ScaleAnimation之后,图像显示不全的问题。
http://www.bkjia.com/Androidjc/929473.html: 问题追踪:ImageView执行缩放动画ScaleAnimation之后,图像显示不全的问题., 问题:我有一个 ...
- Win7系统安装好Axure点击运行报.NET Framework4.0未安装的解决办法
1:问题 由于工作需要,需要研究一下Axure原型设计软件的使用方式,在公司的电脑上成功安装了从同事那里拿来的Axure7.0软件,能够正确运行没有任何问题,在自己的电脑上安装的也非常顺利,不过运 ...
- tornado api 简单模板
# 安装 pip insatll tornado # 主文件 web_server.py #!/usr/bin/env python # encoding: utf-8 import tornado. ...
- No Architectures to Compile for (ONLY_ACTIVE_ARCH=
No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=armv7, VA 运行报错 出现的原因:armv7s是应用在iP ...
- Crypto++ RSA从字符串读取公私匙
string and StringSource (load): string spki = ...; StringSource ss(spki, true /*pumpAll*/); RSA::Pub ...
- Delphi DateUtils时间单元
Uses DateUtils //时间单元,非常有用. 记得引用这个单元,不然不能用. CompareDate 比较两个日期时间值日期部分的大小 CompareDateTime 比较两个日期时间值的大 ...