设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 重新 试卷 创业者
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

如何写出优雅耐看的JavaScript代码(2)

发布时间:2019-09-20 16:14 所属栏目:21 来源:浅夏晴空
导读:一个方法里面最好只做一件事,不要过多的处理,这样代码的可读性非常高 //badcode functionemailClients(clients){ clients.forEach((client)={ constclientRecord=database.lookup(client); if(clientRecord.isAct

一个方法里面最好只做一件事,不要过多的处理,这样代码的可读性非常高

  1. //bad code 
  2. function emailClients(clients) { 
  3.   clients.forEach((client) => { 
  4.     const clientRecord = database.lookup(client); 
  5.     if (clientRecord.isActive()) { 
  6.       email(client); 
  7.     } 
  8.   }); 
  9.  
  10. //better code 
  11. function emailActiveClients(clients) { 
  12.   clients 
  13.     .filter(isActiveClient) 
  14.     .forEach(email); 
  15. function isActiveClient(client) { 
  16.   const clientRecord = database.lookup(client);     
  17.   return clientRecord.isActive(); 

3、对象设置默认属性

  1. //bad code 
  2. const menuConfig = { 
  3.   title: null, 
  4.   body: 'Bar', 
  5.   buttonText: null, 
  6.   cancellable: true 
  7. }; 
  8. function createMenu(config) { 
  9.   config.title = config.title || 'Foo'; 
  10.   config.body = config.body || 'Bar'; 
  11.   config.buttonText = config.buttonText || 'Baz'; 
  12.   config.cancellable = config.cancellable !== undefined ? config.cancellable : true; 
  13. createMenu(menuConfig); 
  14.  
  15.  
  16. //better code 
  17. const menuConfig = { 
  18.   title: 'Order', 
  19.   // 'body' key 缺失 
  20.   buttonText: 'Send', 
  21.   cancellable: true 
  22. }; 

4、避免副作用

函数接收一个值返回一个新值,除此之外的行为我们都称之为副作用,比如修改全局变量、对文件进行 IO 操作等。

当函数确实需要副作用时,比如对文件进行 IO 操作时,请不要用多个函数/类进行文件操作,有且仅用一个函数/类来处理。也就是说副作用需要在唯一的地方处理。

副作用的三大天坑:随意修改可变数据类型、随意分享没有数据结构的状态、没有在统一地方处理副作用。

  1. //bad code 
  2. // 全局变量被一个函数引用 
  3. // 现在这个变量从字符串变成了数组,如果有其他的函数引用,会发生无法预见的错误。 
  4. var name = 'Ryan McDermott'; 
  5. function splitIntoFirstAndLastName() { 
  6.   name = name.split(' '); 
  7. splitIntoFirstAndLastName(); 
  8. console.log(name); // ['Ryan', 'McDermott']; 
  9.  
  10.  
  11. //better code 
  12. var name = 'Ryan McDermott'; 
  13. var newName = splitIntoFirstAndLastName(name) 
  14.  
  15. function splitIntoFirstAndLastName(name) { 
  16.   return name.split(' '); 
  17.  
  18. console.log(name); // 'Ryan McDermott'; 
  19. console.log(newName); // ['Ryan', 'McDermott']; 

在 JavaScript 中,基本类型通过赋值传递,对象和数组通过引用传递。以引用传递为例:

假如我们写一个购物车,通过 addItemToCart()方法添加商品到购物车,修改 购物车数组。此时调用 purchase()方法购买,由于引用传递,获取的 购物车数组正好是最新的数据。

看起来没问题对不对?

如果当用户点击购买时,网络出现故障, purchase()方法一直在重复调用,与此同时用户又添加了新的商品,这时网络又恢复了。那么 purchase()方法获取到 购物车数组就是错误的。

为了避免这种问题,我们需要在每次新增商品时,克隆 购物车数组并返回新的数组。

  1. //bad code 
  2. const addItemToCart = (cart, item) => { 
  3.   cart.push({ item, date: Date.now() }); 
  4. }; 
  5.  
  6. //better code 
  7. const addItemToCart = (cart, item) => { 
  8.   return [...cart, {item, date: Date.now()}] 
  9. }; 

5、全局方法

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读