`

JavaScript 的死与生

 
阅读更多

JavaScript 的成功得益于在正确的时间出现在正确的地点。JavaScript 的兴起与浏览器的支持息息相关。你瞧,VBScript 就没这么好运气。

JavaScript 很流行,但它有先天缺陷。Brendan Eich 当初只花了 10 天时间就把 JavaScript 设计出来了,作为 JavaScript 之父,BE 如是说。

引用
与其说我爱 JavaScript,不如说我恨它。它是 C 语言和 Self 语言一夜情的产物。十八世纪英国文学家约翰逊博士说得好:“它的优秀之处并非原创,它的原创之处并不优秀。”(摘选自阮一峰的翻译:JavaScript 诞生记)



JavaScript 的不足,最明显之处是语法。

糟糕冗长的语法

可选参数和默认值

Javascript代码
function(a, b, option) {
  option = option || {};
  // ...
}
 


上面的代码中,option 是可选参数,当没有传递时,默认值是 {}. 然而,传递的 option 值有可能是假值(falsy 值)。严格来写,得如下判断:

Javascript代码
function(a, b, option) {
  option = arguments.length > 2 ? option : {};
  // ...
}
 



注意:option = typeof option !== 'undefined' ? option : {} 也有可能是错误的,因为传递过来的可能就是 undefined.

当不需要 b 参数,删除后,基于 arguments.length 的判断很容易导致忘记修改而出错:

Javascript代码
function(a, option) {
  option = arguments.length > 2 ? option : {};
  // ...
}
 


如果能增加以下语法该多好呀:

Javascript代码
function(a, b, option = {}) {
  // ...
}
 



Let

闭包很强大,也很恼火:

Javascript代码
for (var i=0, ilen=elements.length; i<ilen; i++) {
  var element = elements[i];
  LIB_addEventListener(element, 'click', function(event) {
    alert('I was originally number ' + i);
  });
}
 


上面的代码经常在面试题中出现,解决办法是再包裹一层:

Javascript代码
for (var i=0, ilen=elements.length; i<ilen; i++) {
  var element = elements[i];
  (function(num) {
    LIB_addEventListener(element, 'click', function(event) {
      alert('I was originally number ' + num);
    });
  }(i));
}
 


如果直接支持 let 语法该多好呀:

Javascript代码
for (var i=0, ilen=elements.length; i<ilen; i++) {
  var element = elements[i];
  let (num = i) {
    LIB_addEventListener(element, function(event) {
      alert('I was originally number ' + num);
    });
  };
}
 



模块

模块模式是一种无奈的选择:

Javascript代码

 

var event = (function() {

  // private variables
  var listeners = [];

  function addEventListener(f) {
    listeners.push(f);
  }

  function clearEventListeners() {
    listeners = [];
  }

  // ...

  // export the module's API
  return {
    addEventListener: addEventListener,
    clearEventListeners: clearEventListeners
    // ...
 };
}());
 



如果原生支持该多好呀:

Javascript代码
module event {

  // private variables
  var listeners = [];

  export function addEventListener(f) {
    listeners.push(f);
  }

  export function clearEventListeners() {
     listeners = [];
  }

  // ...
}
(function() {

  import event;

  // ...
}());
 



继承

JavaScript 要通过原型链来实现继承:

Javascript代码
function Employee(first, last, position) {
  // call the superclass constructor
  Person.call(this, first, last);
  this.position = position;
};
// inherit from Person
Employee.prototype = Object.create(Person.prototype);
Employee.prototype.constructor = Employee;

// define an overridding toString() method
Employee.prototype.toString = function() {
  // call superclass's overridden toString() method
  return Person.prototype.toString.call(this) +
         ' is a ' + this.position;
};
 



如果能写成下面这样该多好呀:

Javascript代码
class Employee extends Person {
  constructor(first, last, position) {
      super(first, last);
      public position = position;
  }

  update(camera) {
      return super.update() + ' is a ' + position;
  }
}
 

分享到:
评论

相关推荐

    javascript做简单计算生存小时

    javascript做简单计算生存小时,从你的身份证中提取出生日期。

    life-js:康威在 JavaScript 中的生命游戏

    康威的人生游戏生命游戏的宇宙是一个无限的二维正交方格网格,每个方格都处于两种可能的状态之一,生或死。 每个单元格与其八个相邻单元格相互作用,这些单元格是水平、垂直或对角相邻的单元格。 在时间的每一步,...

    The-Race:进行中的Javascript游戏

    进行中的Javascript游戏 团队(DiJitech) ? 角色? DJ-团队负责人/游戏程序员Joe-市场营销主管-网站/游戏后端工程师? 陆克文-? Kiara-艺术 扩展文章/市场营销 沙门 布赖恩 比赛-玩家打开了另一个充满动作的无尽...

    vue实现在线学生录入系统

    因为主要是巩固Vue的知识,所以数据也没放数据库,也没用JavaBean或者Servlet,直接写死到表单里了。 具体页面是这样的: 先罗列一下其中用到的Vue的知识点: ①v-for指令的使用 ②v-model指令的使用 ③v-on/@click...

    game-of-life-exercise:用javascript进行的人生运动游戏

    用javascript进行的人生运动游戏 规则 附近的细胞死亡 &gt; 3-&gt;死附近的细胞 2 || 3附近的细胞-&gt;存活 = 3附近的单元格-&gt;出生 时间跟踪 初始业力和测试环境8分钟 创建并测试第一个测试4分钟 创建周期和最近的单元格检查...

    jcon:JavaScript解析器组合器库

    jcon 我们是在时间之中仿惶,从宇宙诞生直到死亡的时间里。 所以我们无所谓生也无所谓死。只是风。

    yes-mi-lord:使用指环王 API 生成角色详细信息的幻想团队构建器。 使用 Express、EJS、HTML、CSS、JavaScript、Node、PostgreSQL 和 Express 构建

    是的我主 指环王粉丝页面,允许用户浏览史诗三部曲中的所有角色并组建团队。 该设计旨在让粉丝探索他们最喜欢的角色并建立自己的团队来完成摧毁 The One Ring 的任务。 用户可以评论他们的选择并分享他们的故事。...

    MorbidMotivation

    使用标准的 html、javascript 和 css 构建。 没有使用 JS 库。 使用了 purecss.io(一组极简的 css 模块)的部分内容,并进行了自定义修改。 最初是为不到一天的简短黑客马拉松而创建的。 计划功能: 自定义用于...

    ID_Assignment3

    本项目中使用JavaScript使其动态化。 在该项目中使用jQuery来简化DOM操作。 Bootstrap用于简化响应式网站的创建 Adobe XD Adobe Illustrator 2021 验证 测验 学分 API:来自COVID-19数据 动画: 字体:

    Tetris-Multiplayer

    您可以创建一个大厅,其他玩家可以加入您的游戏大厅,也可以在等待玩家加入并与您一起游戏时创建并玩游戏。 当网格填满时,您已经输了,死亡计数器将增加1,然后返回到已连接的玩家页面。 玩俄罗斯方块: 部件...

    deathcube-successor-tower:CS1010R项目制作了一款塔防游戏,教给学生OOP概念

    CS1010R:塔防/攻击多人游戏 游戏玩法: 游戏中有两名玩家,玩家1占据了地图的左半部分,玩家2占据了地图的右半部分。 这两个玩家由两个由学生编写的AI程序控制。 在此游戏中,两名玩家将同时派出士兵攻击对手的基地...

    java乒乓球源码-suraj-kumar.github.io:suraj-kumar.github.io

    我喝了几杯就变成了哲学家,可以和你辩论生、死、幸福、灵性等。 我做的事情? 我在 Applozic Inc 担任技术主管。在基于 Web 的企业应用程序、Web 服务和 AI 驱动的聊天机器人的设计和开发的各个方面拥有近 5 年的...

    GrowthSpurt:游戏化饮食健康!

    灵感我们的团队很难吃得健康,我们也知道很多其他大学生也是如此。 为了使这一点变得更容易和更具激励性,我们决定将健康饮食变成一种游戏,以尝试给人们一些额外的推动力,以遵循健康饮食习惯。它能做什么该项目从...

    test_26012021

    test_26012021 要求此存储库中的文件是为特定方案创建的。 用户故事:作为会员,我希望能够在屏幕上选择各种选项,以便我可以在屏幕上计算和查看每月保费。 要求制作一个接受以下输入的屏幕,并在屏幕上显示死亡总数...

    student-portfolio-website:该存储库将包含我在Tanay Sir的帮助下进行前端开发人员访谈而构建的我的投资组合

    简历已死。 雇主期望的工作证明! 随意从我的项目中获取任何代码并使用它。 现在,我知道, javascript Node.js 粉笔 复制 CSS笔记-在笔记本中复制3种方式以在HTML中包含CSS 在头标签中使用样式标签 身体中...

    Toy-OS-Project:我正在从头开始编写的自定义64位操作系统内核

    简介他们说,死前必须做的三件事:写书,生孩子和种树。 那些人错了。 该列表实际上只有4件事:编写您自己的bot,创建​​一个庞大的,无用的框架,只有您会使用,编写自己Linux内核模块,以及创建自己的操作系统。 ...

    dsc2020-finalproject-fe:开发者学生俱乐部前端的最终项目

    Binus DSC Frontend最终项目(Covid Tracker) 这是Binus DSC Frontend Weekly Workshop的最终项目,在这里我们必须创建一个名为Covid Tracker的网站,用户可以使用给定的API检查已恢复,阳性和死亡病例的概况以及...

    CPP-Rolodex

    对于学生而言,这意味着不再需要寻找资源的死胡同;对于服务器运营商而言,这意味着更容易管理外展。 用法 用户命令 $cpp about Displays bot information $cpp help Displays the help guide $cpp leaderboard ...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    Chrome Frame 会把最新版的Chrome Webkit 内核和JavaScript 引擎注入到IE中, IE浏览器将获得Chrome的性能和功能 目录 摘要 I ABSTRACT II 专业名词清单 III 第一章 绪论 1 1.1 研究背景与意义 1 1.2国内外相关...

    bdsDemo:BDS数据集的数据可视化

    bdsDemo 待办事项: 地图下方的条形图显示了选定年份中的所有区域,按降序排列为升序当前选定区域的条形图,显示所有年份-可以通过^条形图或地图进行选择。 改变想要的变量的能力(出生-死亡,出生,死亡)。

Global site tag (gtag.js) - Google Analytics