总则-都是对象,都是引用

在接触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学习之路(这个觉得写的很好,放在这里是方便查看)的更多相关文章

  1. 【温故知新】——BABYLON.js学习之路·前辈经验(二)

    前言:在上一篇随笔BABYLON.js学习之路·前辈经验(一)中回顾了组内同事们长时间在Babylon开发实践中的总结出的学习之路和经验,这一篇主要对开发中常见的一些功能点做一个梳理,这里只作为温故知 ...

  2. node.js学习之路

    (非原创) 目录 Nodejs的介绍 15个Nodejs应用场景 Nodejs学习路线图 1. Nodejs的介绍 Node.js的是建立在Chrome的JavaScript的运行时,可方便地构建快速 ...

  3. JS学习之路,菜鸟总结的注意事项及错误更正

    JavaScript 是一种面向对象的动态语言,它的语法来源于 Java 和 C,所以这两种语言的许多语法特性同样适 用于 JavaScript.需要注意的一个主要区别是 JavaScript 不支持 ...

  4. 偏前端-vue.js学习之路初级(一)概念

    首先--不推荐新手直接使用 vue-cli,尤其是在你还不熟悉基于 Node.js 的构建工具时.    新建一个html,引入一下js: <!-- 开发环境版本,包含了有帮助的命令行警告 -- ...

  5. react.js学习之路一

    今天新老大来了,我们要学习他使用的框架react.js,现在是两眼一抹黑,对于我这个前端菜鸟来说,是真正的重新开始,好了,不说那么多了,开始随便记录我的学习,之后再整理内容. (1)对于react来说 ...

  6. JS学习之路

    前言 接触js也有四五年的时间了,对js的认识也逐渐加深,想把自己这几年学习js的经历记录一下. 总则-都是对象,都是引用 在接触js前用的比较多的是java,在刚开始接触js的时候,老实讲,我是有点 ...

  7. js 学习之路4:js运行/输出中文乱码问题解决

    网上找了一个简单的例子,编写出来很简单,但是乱码的问题稍微困扰了一下. 题目: 1. 大马驮2石粮食,中马驮1石粮食,两头小马驮一石粮食,要用100匹马,驮100石粮食,该如何调配? js解决代码: ...

  8. react.js学习之路二

    看react.js对我来说真的不是难不难的问题,问题是我的思路太难转变了,真是坑死我了,react里面的坑也很多.算了,这些抱怨没啥用,记录一下今天学习的内容. 今天看了to-do-list经典示例 ...

  9. 偏前端-vue.js学习之路初级(二)组件化构建

    vue.js   组件化构建 组件系统是 Vue 的另一个重要概念,因为它是一种抽象,允许我们使用小型.自包含和通常可复用的组件构建大型应用.仔细想想,几乎任意类型的应用界面都可以抽象为一个组件树: ...

随机推荐

  1. 工程中建立多个src目录

    android 工程下可以有多个源代码的目录,不一定都要放到src下面.可以在 .classpath 文件中添加. 默认是这样的: <classpath> <classpathent ...

  2. c++智能指针实现方式1

    #include<iostream> using namespace std; // 定义仅由HasPtr类使用的U_Ptr类,用于封装使用计数和相关指针 // 这个类的所有成员都是pri ...

  3. 【学】jQuery的源码思路4——增加一些功能

    本文说一些简单的jQuery实现原理 eq() get() hide() show() index() find() //返回找到的一组元素中的第n个 zQuery.prototype.eq=func ...

  4. Node.js的process.nextTick(callback)理解

    Node.js是单线程的,基于事件循环,非阻塞 IO的.事件循环中使用一个事件队列,在每个时间点上,系统只会处理一个事件,即使电脑有多个CPU核心,也无法同时并行的处理多个事件.因此,node.js适 ...

  5. Visual Studio 14 初试,vNext

    下了几天的VS 2014 .终于安装上了,花了好几天时间, VS 2014  下载地址, http://www.visualstudio.com/en-us/downloads/visual-stud ...

  6. 本地新建项目提交到github

    1.在github上创建项目(可以添加README.md),创建后的地址为 https://github.com/xxx/xxx-demo.git 2.在eclipse上新建个quick-start的 ...

  7. jquery 获取元素在浏览器中的绝对位置

    代码详解 1,获取对象(自定义调整打开新窗口参照元素) var obj = $("#oButton"); 实例中我获取的对象是弹出窗口按钮,这样创建的新窗口就会根椐按钮的位置进行调 ...

  8. Spring+Quartz(定时任务)

    此处用到的Quartz版本是quartz-2.2.3 官方网站:http://www.opensymphony.com/quartz 首先先介绍用到的几个关键类:scheduler任务调度.Job任务 ...

  9. lombok

    参考http://blog.csdn.net/mlinge/article/details/51340362

  10. Shogun网站上的关于主流机器学习工具包的比较

    Shogun网站上的关于主流机器学习工具包的比较: http://www.shogun-toolbox.org/page/features/   created last updated main l ...