jQuery片段:

  1. /*!
  2. * jQuery JavaScript Library v1.3.2
  3. * http://jquery.com/
  4. *
  5. * Copyright (c) 2009 John Resig
  6. * Dual licensed under the MIT and GPL licenses.
  7. * http://docs.jquery.com/License
  8. *
  9. * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
  10. * Revision: 6246
  11. */

  查看任何源码时,我们通常都会看到开篇的地方会有一段解说,说明该段或者该文件中的源代码到底干了什么事情,并且在代码的字里行间,我们也可以看到这些说明穿插其中。而为了让这些说明能自由地穿插,JavaScript(以后的章节如没有特别说明,提及JavaScript的地方都是范指所有浏览器支持的JS,而不是特指Netscape的原版),提供了注释的机制。这种机制和其他高级语言基本上是一致的。例如标准的注释如下:

  • 单行注释

    1. // 以下的每一行都是单行注释,能出现不影响文件解释的编码内字符
    2. // 非编码内字符必须不能影响结束符
    3. // 凡是出现文本结束符,也就是我们的回车换行时,JS解释器就会将其当作注释结束
    4. // 为了减少冲突通常再“//”后会加一个空格
  • 多行注释
    1. /*
    2. * 由斜杠“/”和星号“*”顺序组合成多行注释的起始符
    3. * 而反向组合则是多行注释的终结符
    4. * 通常注释这会加入更多的星号(包整块注释包围)
    5. * 但这只是为了阅读美观而已,并没有实质作用
    6. */

  看到以上的例子,可能你觉得这些都是很浅白的问题,然而,就是这么浅白的东西也可能会难倒人的。我曾经在CSDN上遇到一个问题,就是因为注释的字符编码引起的。详细的问题可以查看以下链接:http://topic.csdn.net/u/20090616/19/5ff988e4-e45e-445d-830a-a9d9f3ab606c.html。所以,如果某天你遇到某段自己编写的代码运行不了,但源代码怎么也查不出错误的时候,可以尝试一下先把所有注释去掉。(关于注释快速去除,可以选择使用网上流行的JS压缩工具,稍后我也将放出自己版本的压缩工具。)

  除此之外,Microsoft的IE还对此搞了点特殊化——条件注释(condition comments)。先看一下示例:

  1. // IE中启动条件注释的方法如下:
  2. //@ 条件编译语句
  3. /*@ 条件编译语句 @*/
  4. // 对于单行的条件注释,双反斜杠和@之间可以存在空格。
  5. /*@cc_on// 带@号的cc_on代表的是启动条件编译
  6. // 带@号的if和带@号的_jscript分别是条件语句和内置变量
  7. @if (@_jscript)
  8. // 因为在注释中,所以其他浏览器不会编译以下语句
  9. alert('You are using Internet Explorer');
  10. // 带@号的else是条件编译下的分支语句
  11. @else*/
  12. // 以下代码IE会因条件编译而忽略
  13. alert('You are not using Internet Explorer');
  14. /*@end//这里是条件编译终止语句
  15. @*/

  因为这是IE专有的特性,对于现在程序员们追寻的整合型JS显得格格不入,但是其实这个属性却是值得利用的。就如上面的例子,利用条件注释和条件编译的IE特性,我们可以很容易把IE和其他浏览器区分开来,然后再针对其进行实现。但是,由于缺乏文档支持(或者只是我没找到),我们不清楚条件编译会不会对性能造成影响,所以一般不建议使用。(即使不编译,但是JS文件还是会整体读取的,我们应该尽量减少JS文件的大小来达到带宽性能的优化。)

  以下内容将是对条件注释和条件编译进行详细的解说,如果没有兴趣,可以跳过下一节。

条件注释与条件编译

  Microsoft设计条件编译的初衷是为了让新特性和旧版本兼容,并逐渐成为新的标准。可惜IE的垄断不成,而该特性也成为人们忽略掉的专用特性。一般来说,条件编译会与条件注释一起使用,以使不支持条件编译的浏览器不将其当作错误而停止编译运行。——这里需要注意的是,条件编译不等于条件注释,他们是不同的概念。条件编译的语法比较类似Basic(Microsoft离开不了的东西啊……)。

  • @cc_on 语句
    @cc_on是用来打开条件注释的语句,如果没有将条件注释打开,所有在注释中的条件编译语句都将被当成注释内容处理。
  • @if 语句
    @if与JS语法中的if基本一致。但分支语法有一点差别,具体语法如下:
    @if (
      condition1
    )
       text1

    [@elif (
      condition2

    )
       text2]
    [@else

       text3]
    @end 
    其中condition指判断条件,text指判断运行分支后执行的JS脚本源码。PS:注意条件判断分支中@elif,和JS中的else if是一样的,但是需要注意关键字的不同。
  • @set 语句
    @set是用来创建条件编译变量的语句。创建的条件编译变量必须以@开头,如@newVar。另外,条件编译变量只支持数字和布尔类型的值,不支持字符串。赋值的时候,如果需要用到多元表达式,必须用圆括号括起来,否则,可能会引发编译错误或者赋值不正确。而表达式中支持如下运算符(按优先级排序):
    1. ! ~ 
    2. * / % 
    3. + - 
    4. << >> >>> 
    5. < <= > >= 
    6. == != === !== 
    7. & ^ | 
    8. && || 
    特别地,如果一个变量没有定义过,他的值为NaN。而因为NaN的特性,我们可以用条件语句判断一个条件编译变量是否已定义:
    1. @if(@varNew!=@varNew)
    2. alert(isNaN(@varNew));
    3. @end
  • 其他条件编译变量
    IE为条件变量预定义了一组变量,如下表所示:
    变量 描述
    @_win32 在 Win32 系统上运行为 true。
    @_win16 在 Win16 系统上运行为 true。
    @_mac 在 Apple Macintosh 系统上运行为 true。
    @_alpha 在 DEC Alpha 处理器上运行为 true。
    @_x86 在 Intel 处理器上运行为 true。
    @_mc680x0 在 Motorola 680x0 处理器上运行为 true。
    @_PowerPC 在 Motorola PowerPC 处理器上运行为 true。
    @_jscript 永远为 true。
    @_jscript_build 包含 Jscript 脚本引擎创建号。
    @_jscript_version 包含以 major、minor 为格式的 Jscript 版本号。

    当上表中变量不为true时,会作为NaN处理。

  我认为,虽然条件注释和条件编译不是标准化的东西,但是他的存在还是有一定价值的(例如用于处理IE的特殊化特效处理——就是IE搞的特殊太多……)。不过,这东东或许太偏了,不如window.navigator用得顺手。大家就当增长见闻吧——虽然现在基本没什么机会会看到了。呵呵

[从jQuery看JavaScript]-注释(comments)的更多相关文章

  1. [从jQuery看JavaScript]-匿名函数与闭包(Anonymous Function and Closure)【转】

    (function(){ //这里忽略jQuery所有实现 })(); 半年前初次接触jQuery的时候,我也像其他人一样很兴奋地想看看源码是什么样的.然而,在看到源码的第一眼,我就迷糊了.为什么只有 ...

  2. [从jQuery看JavaScript]-变量与作用域链

    jQuery片段: var // Will speed up references to window, and allows munging its name. window = this, //  ...

  3. [从jQuery看JavaScript]-匿名函数与闭包

    jQuery片段: (function(){ //这里忽略jQuery所有实现 })(); 半年前初次接触jQuery的时候,我也像其他人一样很兴奋地想看看源码是什么样的.然而,在看到源码的第一眼,我 ...

  4. [从jQuery看JavaScript]-匿名函数与闭包(Anonymous Function and Closure)

    http://blog.csdn.net/natineprince/article/details/4759533   jQuery片段: (function(){ //这里忽略jQuery所有实现 ...

  5. [从jQuery看JavaScript]-JavaScript

    什么是JavaScript?相信随便百度Google一下都能找到一大堆的定义解释.而在我的理解中,JavaScript就是一种客户端的脚本语言,用于处理页面数据逻辑和用户体验(网页特效).实际上,Ja ...

  6. JavaScript 注释规范

    JavaScript 注释规范 总原则 As short as possible(如无必要,勿增注释).尽量提高代码本身的清晰性.可读性. As long as necessary(如有必要,尽量详尽 ...

  7. jQuery? 回归JavaScript原生API

    如今技术日新月异,各类框架库也是层次不穷.即便当年漫山红遍的JQuery(让开发者write less, do more,So Perfect!!)如今也有被替代的大势.但JS原生API写法依旧:并且 ...

  8. 节点的创建--对比jQuery与JavaScript 方法

    一.  创建节点: 节点是DOM结构的基础,根据DOM规范,节点是一个很宽泛的概念,包含元素.属性.文本.文档和注释.但在实际开发中,要动态创建内容,主要操作的节点包括元素.属性和文本. 1.需求:创 ...

  9. 代码的坏味道(13)——过多的注释(Comments)

    坏味道--过多的注释(Comments) 特征 注释本身并不是坏事.但是常常有这样的情况:一段代码中出现长长的注释,而它之所以存在,是因为代码很糟糕. 问题原因 注释的作者意识到自己的代码不直观或不明 ...

随机推荐

  1. python学习笔记014——错误和异常

    Python有两种错误很容易辨认:语法错误和异常. 1 什么是语法错误 Python 的语法错误或者称之为解析错,是初学者经常碰到的,如下实例 if i>4 print("if语句输出 ...

  2. 转 web前端性能分析--实践篇

    当我们知道了web前端性能的关键点后,那么接下来要做的就是如何去具体实施并获取这些关键点的数据了.通过前面的学习知道了不少好的工具,经过对比后个人觉得dynatrace还是不错的. 不仅支持ie,ff ...

  3. System V IPC

    1.概述 System V IPC共有三种类型:System V消息队列.System V 信号量.System V 共享内存区. System V IPC操作函数如下: 2.key_t键和ftok函 ...

  4. Python lstrip() 方法

    描述 Python lstrip() 方法用于删除字符串头部指定的字符,默认字符为所有空字符,包括空格.换行(\n).制表符(\t)等. 语法 lstrip() 方法语法: S.lstrip([cha ...

  5. tomcat6的编译和导入myeclipse

    声明:近期在学习tomcat6的源代码,网上搜索了些相关的资料,并自己操作了下进行了对应的汇总.如今总结例如以下 本文目的:编译tomcat6源代码+导入tomcat6源代码到myeclipse 測试 ...

  6. PHP安装Redis扩展教程

    安装redis 下载软件包phpredis  https://github.com/nicolasff/phpredis uzip  master    #解压得到 phpredis-master c ...

  7. PixelLink

    简介 论文题目:PixelLink: Detecting Scene Text via Instance Segmentation 论文地址:https://arxiv.org/abs/1801.01 ...

  8. MySQL日期与时间戳互转函数

    -- 时间戳转日期 ); #日期转时间戳 Select UNIX_TIMESTAMP('2018-07-16 12:23:00');

  9. ERROR: JDWP Unable to get JNI 1.2 environment的错误解决方法

    在用java编程的时候,在debug模式下偶尔会出现下面的错误,jdk1.6.0-rc1: ERROR: JDWP Unable to get JNI 1.2 environment, jvm-> ...

  10. Qt多个信号连接到一个槽,在槽中识别信号的发送者方法(实验 可行)

    Qt是通过信号和槽的机制进行事件传递的,当有多个不同类型.或相同类型的物件的发送信号都通过一个槽来处理的时候,需要在槽中识别出这些信号然后做相应的处理. 例如: 在一个界面中有16个按钮(QPushB ...