前言

接触js也有四五年的时间了,对js的认识也逐渐加深,想把自己这几年学习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学习之路的更多相关文章

  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. react.js学习之路二

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

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

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

  6. react.js学习之路四

    针对学习react.js中,我感觉最大的疑惑点就是bind(this)的绑定和指向问题了,我被这个问题弄的头昏,有时候调用组件的时候,直接显示undefined,不存在这个组件,当时的心情是崩溃的,整 ...

  7. react.js学习之路三

    学习react.js,知识点整理: 1.props和state: props是相对于父级来说,固定的不会改变的内容.一般会先定义一个变量,则在父级中进行引用, var user = "liu ...

  8. react.js学习之路一

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

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

    前言:公司用BABYLON作为主要的前端引擎,同事们在长时间的项目实践中摸索到有关BABYLON的学习路径和问题解决方法,这里只作为温故知新. 一.快速学习BABYLON 1. 阅读Babylon[基 ...

随机推荐

  1. react native中对props和state的理解

    最近使用react native这个新的技术做完一个项目,所以赶紧写个博客巩固一下. 今天我想说的是props和state,当然这是我个人的理解,如果有什么不对的地方,望指正. 首先我先说说props ...

  2. 浏览器-08 chromium 渲染2

    Chromium 硬件加速合成 一个网页通常可以包

  3. BZOJ 2844 albus就是要第一个出场 ——高斯消元 线性基

    [题目分析] 高斯消元求线性基. 题目本身不难,但是两种维护线性基的方法引起了我的思考. void gauss(){ k=n; F(i,1,n){ F(j,i+1,n) if (a[j]>a[i ...

  4. 葱类 Allium

    韭菜  Allium tuberosum (Chinese chives) 韭黄(韭芽):不见光的特殊培养的软化韭菜品种 藠头(薤) Allium chinense (Chinese onion) 蒜 ...

  5. 【编程篇】C++11系列之——临时对象分析

    /*C++中返回一个对象时的实现及传说中的右值——临时对象*/ 如下代码: /**********************************************/ class CStuden ...

  6. MVC 缓存实践(一)

    为什么要讲缓存.缓存到底有什么作用? 下面我们来说一个场景我们有一个首页菜单的布局基本是不会经常发生的变化,如果动态生成的 Web 页被频繁请求并且构建时需要耗用大量的系统资源,那么,如何才能改进这种 ...

  7. 超链接a标签

    a: ---页面中锚点的链接: <a  href="#point"></a> <p id="#point">锚链接</ ...

  8. css3动画----实现动态省略号 ...

    <h3>实现省略号点点动,纯css3实现动态省略号</h3>上传中<span class="dot">...</span> [css ...

  9. bzoj 4503 两个串

    Description 兔子们在玩两个串的游戏.给定两个字符串S和T,兔子们想知道T在S中出现了几次, 分别在哪些位置出现.注意T中可能有“?”字符,这个字符可以匹配任何字符. Input 两行两个字 ...

  10. C语言中定义全局变量

    (1)在C语言的头文件中定义变量出现的问题 最好不要傻嘻嘻的在头文件里定义什么东西.比如全局变量: /*xx头文件*/ #ifndef  _XX_头文件.H #define  _XX_头文件.H in ...