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

在接触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. Delphi编程获取系统当前进程、窗口句柄、文件属性以(转)

    Delphi编程获取系统当前进程.窗口句柄.文件属性以及程序运行状态. uses TLHelp32,PsAPI; (1)显示进程列表:procedure TForm1.Button2Click(Sen ...

  2. 13、java中的多态

    1,多态的体现 父类的引用指向了自己的子类对象. 父类的引用也可以接收自己的子类对象.2,多态的前提 必须是类与类之间有关系.要么继承,要么实现. 通常还有一个前提:存在覆盖. 3,多态的好处 多态的 ...

  3. 【python】pickle模块

    持久性的基本思想很简单.假定有一个 Python 程序,它可能是一个管理日常待办事项的程序,您希望在多次执行这个程序之间可以保存应用程序对象(待办事项).换句话说,您希望将对象存储在磁盘上,便于以后检 ...

  4. apache 使用 .htaccess 导致500错误

    今天在win主机上配置了一个apache+mysql+php 的环境,一切看似正常了.结果将程序转移过来,打开网站的时候,出现了500错误.于是乎查原因: 首先,怀疑的是连接mysql出错了,找出配置 ...

  5. STM32 USB转串口驱动 Virtual COM Port Driver(V1.3.1)

    将stm32的USB口接到PC端后,PC端会要求安装一个STM32 USB Virtual COM Port Driver,然后就可以用串口调试助手对其操作了

  6. Allegro 快捷键设置

    一.快捷键设置 Allegro可以通过修改env文件来设置快捷键,这对从其它软件如AD或PADS迁移过来的用户来说,可以沿用以前的操作习惯,还是很有意义的. Allegro的变量文件一共有2个:一个是 ...

  7. npm命令ionic安装失败cordova安装失败解决方法

    转载:http://bbs.phonegap100.com/thread-2622-1-1.html 镜像使用方法(三种办法任意一种都能解决问题,建议使用第三种,将配置写死,下次用的时候配置还在): ...

  8. CentOS下安装Redis及Redis的PHP扩展

    1.安装Redis 1.1 如果没有安装wget,安装wget yum install wget 1.2 在http://redis.io/download页面查看redis版本,并下载安装 wget ...

  9. java数据传递例子+内存分析

    一.引用传递 1.例子1 package com.jikexueyuan.ref; class Ref1{ int temp = 10; } public class RefDemo01 { publ ...

  10. Python基础篇【第6篇】: Python装饰器

    装饰器 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装饰类, ...