正确理解JavaScript

过去几年我注意到技术圈一个很奇怪的现象,有太多程序员将那些他们只是有过非常浅显的了解, 但其实根本就不懂的技术写到他们的简历中,这个现象几乎每种语言都有,但这其中最严重的就要数javascript了。

你不知道你不懂

出现这种状况的一个很大的原因就是现如今几乎每个开发者的工作都或多或少要依赖于javascript, 但大多数人并不真的理解这门语言,他们常用的学习方式是复制粘贴,使用这种方式, 你永远不会真正学会这门语言,而只能得到一个你已经懂了的假象。

根据我过去几年学习和使用javascript的经验,在你了解之前,你不会知道你其实不懂, 这听起来有点绕,你真正需要的就是有个人来告诉你你其实不懂,你需要全面系统的学习。 我经常面试一些自豪的将javascript列在他们简历中的家伙,但他们通常也就只能做个简单的onClick处理或是表单验证。 使用jQuery或者Dojo这样的框架当然没什么问题,但是除非你能了解隐藏在这些框架之后的javascript技术, 否则你不可能真正的掌握这些工具包的能量所在,下面就是我划分的从低到高的javascript知识点, 分为基础,中级和高级3个部分,看看你知道多少:

javascript的基础知识

  • 知道基本的编程语法,比如循环,判断,try/catch等等 * 理解包括多种函数定义以及赋值的方式,包括匿名函数
  • 理解基本的命名空间,全局(window)空间以及对象空间(不包括闭包)
  • 理解上下文的角色以及this变量的使用 * 理解各种对象以及函数的初始化和声明方式
  • 理解javascript比较操作符,如<, >, ==, ===,以及对象和字符串比较的原理和对象映射 * 理解对象属性和函数的数组索引,以及这和真实的数组之间的区别。

javascript中级知识

* 理解定时器,以及它的工作原理,包括何时以及如何使用定时器来异步执行方法调用

  • 关于回调的深度支持,以及如何通过call和apply方法来控制上下文和函数参数传递
  • 理解JSON标记以及eval函数 * 理解闭包以及他们如何影响你的代码效率
  • AJAX以及对象序列化

javascript高级知识点

  • 理解方法的”arguments’变量,包括如何使用它来通过arguments.length重载函数,以及通过arguments.callee来进行递归调用,需要注意使用这个特性有一定的危险性,因为ECMAScript 5 的Strict模式不支持此功能,但jQuery和Dojo都用到了它。
  • 高级闭包比如 self-memoizing函数,partially applied函数,以及最可爱的 (function(){})()调用。
  • 函数以及HTML prototype,prototype chain,以及如何使用基本的javascript对象和函数(比如Array)来简化代码。
  • 对象类型以及instanceof的使用 * 正则表达式和表达式编译
  • With语句以及为什么不要使用它们 * 最困难的部分,知道如果利用所有这些工具,并产生处干净,整洁,健壮,快速,可维护以及兼容不同浏览器的代码。

这里的最后一点特别重要并且也是最难实现的,因为javascript天生不够严格的语法, 你的程序很容易就会变成意大利面条式的难以维护的灾难代码,一旦你开始学习javascript语言本身, 你只能通过在大型的Web程序中不断实践才能真正掌握它,这可能要花好几年的时间, 并且你没法从书本上学到这些,我自己每天使用javascript好几小时,已经好几年了, 但我还是在不断寻找更好的方式来编写和重构我的代码,出于这个原因,一开始就使用jQuery这样的框架会很危险, 它会很容易让你的代码变得不可维护,Dojo的Class和Package系统则多少会帮上点忙。

考虑到javascript现在已经通过Node.js这样的项目渗透到了后端,我决定将和Web相关的部分单独拉出来讲讲, 也就是说,如果你想要在Web开发中使用javascript,那么下面这些就是每一个优秀程序员都应该了解的:

  • 如何高效的操作Dom(添加,删除以及更新),还有如何通过使用document fragments这样的工具来最小化浏览器的re-flows。
  • 夸浏览器的DOM元素属性提取(比如,style,position等等),jQuery和Dojo都可以很好的完成这些工作,尽管如此,理解从CSS和style标签中提取属性的差异,以及如何计算position和size还是很重要的。
  • 夸浏览器的事件处理,绑定,反绑定,冒泡,以及如何取得期望的回调上下文。在一次,现成的框架也可以很好的处理这些事情,但是你应该对IE浏览器和W3C标准浏览器之间的不同有所了解。
  • 正则表达式选取DOM节点 * 浏览器功能检测以及智能降级

就像你从上面的列表中看到的,对于javascript,除了alert(myval)或者myBtn.οnclick=…, 你还需要了解更多东西,这些都是粘贴复制无法学到的,只有通过阅读和练习, 你才能成为一名真正的javascript程序员。

这里推荐两本关于javascript的好书,”the good parts”和”javascript忍者的秘密”, 如果你只是为了装饰简历,我建议你至少也要搞懂基础阶段的那些知识点,并且至少尝试过中极阶段的那些技术。 一旦你发现当你开始自己开发你想要的功能,而不是从其他人那里拷贝粘贴时,你就可以宣称自己懂javascript了, 在那之前,请先别这样说。

如果我错过了什么关于javascript的概念,欢迎给我留言,同时也别忘了分享任何你关于JS或者其它语言的经验。

需要说明的是我并不是一个前端开发者,我实际上是一个后台开发者,但是因为形势需要, 渐渐变成了一个全协议栈的开发者,现如今,几乎每个后端开发者都需要了解javascript, 这也是我写这篇文章的目的,我并不是想表达我对javascript有多了解, 我只是想说javascript是一门非常强大和庞杂的语言,它远比你第一眼看到的要复杂

本文翻译自”You Don’t Know javascript”(http://www.w2lessons.com/2011/04/you-dont-know-javascript.html), 作者:Michael Woloszynowicz(http://twitter.com/mwbiz)。

转载于:https://www.cnblogs.com/HHJ-XX/archive/2013/04/28/3048841.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376717.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

医疗机构远程视频监控集中管理,贝锐蒲公英提供一站式解决方案

上海某企业专业致力于医疗软件、家居智能化研发、设计、销售、集成及实施&#xff0c;企业主营业务之一为医疗软件&#xff0c;涉及PACS/RIS/WEB/HIS、示教系统等方面的医院信息化建设。 在实际应用、部署过程中&#xff0c;需要实现各地区分院与总院间的数据库互相访问、视频数…

py脚本:linux系统下定时清理文件

linux清空文件内容的三种方法&#xff1a; 1.使用vi/vim命令打开文件后&#xff0c;输入"%d"清空&#xff0c;后保存即可。但当文件内容较大时&#xff0c;处理较慢&#xff0c;命令如下&#xff1a; vim file_name :%d :wq2.使用cat命令情况&#xff0c;命令如下&a…

Process类:启动和停止本地系统进程

Process.Start 方法 (String, String) 通过指定应用程序的名称和一组命令行参数来启动一个进程资源。&#xff08;并将该资源与新的 Process 组件相关联&#xff09; 如果没有启动资源&#xff0c;则返回null Process.Start("d:\\0.jpg"); Process.StartInfo 属性 获…

NYOJ2括号配对问题

括号配对是最基本的栈的问题&#xff0c;它是栈入门的经典题目&#xff0c;思路是&#xff0c;如果是左括号直接进栈&#xff0c;如果是右括号&#xff0c;这时就要比较栈顶的元素与他是否匹配&#xff0c;如果匹配则出栈&#xff0c;否则进栈&#xff0c;下面是代码的实现&…

SVC编码简单了解

基本概念 可伸缩视频编码 SVC&#xff08;Scalable Video Coding&#xff09; 作为 H.264 标准的一个扩展,可用于生成不同帧率、分辨率和质量等可分层的视频流。 基本层编码最低层的时域、空域和质量流&#xff1b; 增强层以基本层作为起始点&#xff0c;对附加信息进行补充&a…

程序集系统重构机房收费系统——起步

这段间时一直在查找程序集系统之类的问题,在现正好有机会和大家同享一下. 开始机房收费系统重构也半个月过去了。但看自己的系统连一个简略的登录还没有实现。自己不免有些羞愧了。近来自己的习学态状总的说来还是不错的。但是由于自己对来原的识知把握的欠好所以致导了自己不知…

ie下的透明度,用滤镜filter:alpha

.box{ width:100px; height:100px; background-color:#000; filter:alpha(Opacity50); opacity: 0.5; } 转载于:https://www.cnblogs.com/liujinyu/p/3931087.html

mysql 修改字段类型

修改字段类型&#xff1a; alter table 表名 modify column 字段名 类型。 --如 alter table province_quality modify column quality float(8,2); mysql> describe province_quality ; --------------------------------------------------- | Field | Type |…

Ubuntu硬盘优化,降低硬盘温度(Acer V5 亲测成功 )

1.安装laptop-mode-tools sudo apt-get install laptop-mode-tools2.修改电源管理配置: laptop-mode.conf sudo vim /etc/laptop-mode/laptop-mode.conf修改配置文件&#xff1a; #有关参数的说明请参照文件里的注释说明 ENABLE_LAPTOP_MODE_ON_AC1 #当笔记本使用交流电时也开启…

XmlSerializer 对象的Xml序列化和反序列化,XMLROOT别名设置

这篇随笔对应的.Net命名空间是System.Xml.Serialization&#xff1b;文中的示例代码需要引用这个命名空间。 为什么要做序列化和反序列化&#xff1f;.Net程序执行时&#xff0c;对象都驻留在内存中&#xff1b;内存中的对象如果需要传递给其他系统使用&#xff1b;或者在关机时…

C++智能指针使用指南 part2:智能指针本身的方法以及使用建议

目录往期文章智能指针本身的方法对于unique_ptr对于shared_ptr对于weak_ptr使用建议1、使用工厂函数而非new构造对象2、在类内部调用其他类的方法3、在某类内部将当前对象指针共享给其他对象4、 智能指针只能管理堆对象&#xff0c;不能管理栈上对象5、不能将this指针直接托管给…

“/”应用程序中的服务器错误。

运行时错误 说明: 服务器上出现应用程序错误。此应用程序的当前自定义错误设置禁止远程查看应用程序错误的详细信息(出于安全原因)。但可以通过在本地服务器计算机上运行的浏览器查看。 详细信息: 若要使他人能够在远程计算机上查看此特定错误消息的详细信息&#xff0c;请在位…

JAVA_Collection容器

因为项目的需要&#xff0c;今天抽时间把JAVA中的容器复习了一下&#xff0c;为了以后的不时之需&#xff0c;现在把它记下来。 容器有其名&#xff0c;知其意&#xff0c;用来盛放数据的集合&#xff0c;JAVA中为我们提供了三种容器类&#xff1a;set、list、map&#xff0c;三…

对于enable_shared_from_this、shared_from_this使用笔记

文章为转载汇总 参考&#xff1a;C11标准库的一个工具类enable_shared_from_this的作用及原理分析 从这篇文章中可以知道&#xff1a; 当一个类public继承enable_shared_from_this时&#xff0c;会获得一个共有方法shared_from_this&#xff1a; class T : public enable_shar…

db file sequential read 事件的优化(一)

db file sequential read 事件的优化&#xff08;一&#xff09; db file sequential read等待事件有3个参数&#xff1a;file&#xff03;&#xff0c;first block&#xff03;&#xff0c;和block数量。在10g中&#xff0c;这等待事件受到用户I/O等待级别的影响。当处理db fi…

2014-08-26 遇到的小问题

不能快速的保存bug的确是很不爽的事情 &#xff0c;不仅客户着急 领导也着急 &#xff0c;自己也着急。。。。。。。。哈哈 原来好好的一个平台 简单的一个插入记录 突然就报错了 错误为 could not insert #9521 原来项目是用 NHibernate 做的插入 抛出的异常 真是无法定位到底…

Fatal error: Please read “Security“ section of the manual to find out how to run mysqld as root

.通过在命令后面加上–userroot 进行强制使用root账号启动。 cd /etc/init.d mysqld --userroot 参考&#xff1a; https://blog.csdn.net/huo_wa/article/details/117550307?spm1001.2101.3001.6650.2&utm_mediumdistribute.pc_relevant.none-task-blog-2%7Edefault%7ECT…

取消cp别名'cp -i'(unalias)

在rhel4updae8系统是使用cp命令覆盖文件总是提示要输入yes或no&#xff0c;即使加上-f参数也无法强行覆盖。[2] 方法一&#xff1a; 输入alias命令&#xff0c;看到系统内部使用的是cp的别名。 #alias alias cpcp -i 输入unalias cp命令&#xff0c;解除别名。 unalias cp #&…

增加swap分区

在确定了服务器所需要使用的内存后&#xff0c;需要增加1024M的swap空间 具体操作&#xff1a; 1、dd if/dev/zero of/tmp/swap bs1M count1024M #创建1024M的文件块 2、mkswap /tmp/swap #创建swap文件 3、swapon /tmp/swap #激活swap文件 4、swapon -s #查看swap 5、修改…

python 实现 topk算法

这里的版本是针对的一个class的某一个成员变量进行的&#xff1a; 关于如何定义对象的比较方法&#xff0c;请参考往期文章&#xff1a;python定义对象的比较方法 class province_room_quality_data:def __init__(self, room, quality):self.room roomself.quality qualityd…