首页 > 编程语言 >JavaScript开发中常见问题代码和相关优化Demo参考1.0

JavaScript开发中常见问题代码和相关优化Demo参考1.0

时间:2024-12-20 11:12:00浏览次数:5  
标签:function 常见问题 const log Demo 代码 console 1.0 li

1. 异步编程的理解和使用

问题代码:

function fetchData(url, callback) {
  setTimeout(() => {
    // 模拟异步请求
    const data = { message: "Hello World" };
    callback(data);
  }, 1000);
}

fetchData('http://example.com', function(response) {
  console.log(response);
  // 更多逻辑...
});

解决方案: 使用Promiseasync/await来简化异步操作。

function fetchData(url) {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve({ message: "Hello World" });
    }, 1000);
  });
}

// 使用 async/await
async function loadAndProcessData() {
  try {
    const response = await fetchData('http://example.com');
    console.log(response);
    // 更多逻辑...
  } catch (error) {
    console.error("Error fetching data:", error);
  }
}
loadAndProcessData();

2. 作用域与闭包

问题代码:

for (var i = 0; i < 5; i++) {
  setTimeout(function() {
    console.log(i); // 打印5次5
  }, 1000);
}

解决方案: 使用let关键字或者立即执行函数表达式(IIFE)创建一个新的作用域。

for (let i = 0; i < 5; i++) {
  setTimeout(function() {
    console.log(i); // 正确打印0到4
  }, 1000 * i);
}

3. 事件循环和宏任务/微任务

问题代码:

console.log('Start');

setTimeout(() => console.log('SetTimeout'), 0);

Promise.resolve().then(() => console.log('Promise'));

console.log('End');

解决方案: 理解输出顺序,确保按预期处理宏任务和微任务。

// 输出顺序应该是:
// Start
// End
// Promise
// SetTimeout

4. DOM操作性能

问题代码:

const ul = document.querySelector('ul');
for (let i = 0; i < 1000; i++) {
  let li = document.createElement('li');
  li.textContent = `Item ${i}`;
  ul.appendChild(li);
}

解决方案: 批量更新DOM,例如使用文档片段(DocumentFragment)。

const ul = document.querySelector('ul');
const fragment = document.createDocumentFragment();
for (let i = 0; i < 1000; i++) {
  let li = document.createElement('li');
  li.textContent = `Item ${i}`;
  fragment.appendChild(li);
}
ul.appendChild(fragment);

5. 不必要的全局变量污染

问题代码:

function createGreeting(name) {
  greeting = `Hello, ${name}`; // 没有声明greeting变量
}

createGreeting('World');
console.log(greeting); // Hello, World

解决方案: 总是明确地声明变量以避免意外创建全局变量。

function createGreeting(name) {
  const greeting = `Hello, ${name}`; // 声明为局部变量
  return greeting;
}

console.log(createGreeting('World')); // Hello, World

6. 错误处理不足

问题代码:

function divide(a, b) {
  return a / b;
}

console.log(divide(10, 0)); // Infinity

解决方案: 添加适当的错误检查和处理。

function divide(a, b) {
  if (b === 0) throw new Error('Division by zero is not allowed.');
  return a / b;
}

try {
  console.log(divide(10, 0));
} catch (error) {
  console.error(error.message);
}

7. 对象和数组的浅拷贝 vs 深拷贝

问题代码:

const obj1 = { name: 'Alice', details: { age: 25 } };
const obj2 = Object.assign({}, obj1);
obj2.details.age = 30;
console.log(obj1.details.age); // 30

解决方案: 使用深拷贝方法如JSON.parse(JSON.stringify())或库如lodash

const obj1 = { name: 'Alice', details: { age: 25 } };
const obj2 = JSON.parse(JSON.stringify(obj1));
obj2.details.age = 30;
console.log(obj1.details.age); // 25

8. 不安全的直接DOM字符串插入

问题代码:

const userName = "<script>alert('XSS');</script>";
document.getElementById('user').innerHTML = `Welcome, ${userName}`;

解决方案: 避免直接插入用户输入,使用文本节点或属性绑定。

const userName = "<script>alert('XSS');</script>";
document.getElementById('user').textContent = `Welcome, ${userName}`;

9. 缺乏模块化设计

问题代码: 所有代码写在一个大文件中,没有分离关注点。

解决方案: 采用模块化设计,比如使用ES6模块。

// math.js
export function add(a, b) {
  return a + b;
}

// main.js
import { add } from './math.js';
console.log(add(1, 2));

10. 忽略了浏览器兼容性

问题代码: 使用了特定浏览器特性而忽略了其他浏览器的支持情况。

解决方案: 使用Polyfill或检查环境支持。

if (!String.prototype.startsWith) {
  String.prototype.startsWith = function(search, pos) {
    return this.substr(!pos || pos >= this.length ? 0 : +pos, search.length) === search;
  };
}

1.0 - 完

标签:function,常见问题,const,log,Demo,代码,console,1.0,li
From: https://www.cnblogs.com/xiaozhu007/p/18618847

相关文章

  • 2024 IDEA 2024.3 安装使用教程(附激活至2099年,以及常见问题处理)
    IntelliJIDEA简介IntelliJIDEA是一款非常强大的Java集成开发环境(IDE),由JetBrains公司开发。它提供了丰富的功能和工具,帮助开发者更高效地编写、调试和部署代码。下面这种方式仅供交流学习,如果有能力还请支持正版下载安装下载IDEA2024.3版本的安装包为了方便,也可以去链......
  • 大文件传输与断点续传实现(极简Demo: React+Node.js)
    大文件传输与断点续传实现(极简Demo:React+Node.js)简述使用React前端和Node.js后端实现大文件传输和断点续传的功能。通过分片上传技术,可以有效地解决网络不稳定带来的传输中断问题。文章内容前端实现(React)首先,您需要在前端项目中安装axios、spark-md5库以处理HTTP请求。可以......
  • 2024 Clion安装使用教程(附激活以及常见问题处理)
    第一步:下载Clion安装包访问Clion官网,下载Clion第二步:安装Clion下载完成后,进行安装,next,安装完成点击xx关掉程序!第三步:下载补丁Clion补丁文件点击获取补丁下载成功后,打开标注的文件文件夹,进入到文件夹/jetbra注意:这个文件夹单独copy一份,所属文件夹需单独......
  • 常见问题汇总
    1.c#web项目使用集合形式的参数,接收不到参数出现如下错误时"TheJSONrequestwastoolargetobedeserialized"。解决方案如下:[HttpPost]publicasyncTask<JsonResult>ReceivemThirdPartyMatPrice(){//获取请求体的原始JSON......
  • 项目案例——常见问题collapse
    前言本项目是一个常见的面板式问答交互组件,也被称为手风琴效果。点击问题标题可以展开或收起对应的答案内容。项目注重于简洁的设计和易用性,使用纯CSS实现展开/收起的动画效果。学习目标本项目主要完成学习目标:(1)创建常见问题collapse项目文件夹(2)明白项目实现的基本原理......
  • Hard Demon Problem
    HardDemonProblemSwingisopeningapancakefactory!Agoodpancakefactorymustbegoodatflatteningthings,soSwingisgoingtotesthisnewequipmenton2Dmatrices.Swingisgivenan$n\timesn$matrix$M$containingpositiveintegers.Hehas$q......
  • 【内向基环树】codeforces 2044 G1. Medium Demon Problem (easy version)
    前言基环树,又名环套树,是具有\(n\)个节点和\(n\)条边的图,比树多出现一个环。基环树也根据边的有向和无向分为了有向基环树和无向基环树。有向基环树又可以分为内向基环树和外向基环树。对于有向基环树,若基环树的每个节点的出度均为\(1\),则称为内向基环树;若基环树的每个节点的......
  • 视频去重原理及 Demo 示例
    视频去重是一个常见的需求,主要用于视频库或平台管理中,通过判断视频是否相同(或相似)来移除冗余内容。实现视频去重可以通过多种方法,具体选择取决于业务场景和性能要求。1.视频去重的原理1.1基本原理视频去重的核心在于计算视频的特征,然后比较这些特征以判断视频是否相同......
  • tauri2文件资源访问和存储常见问题解决
    上tauri2的github上搜一下,发现问题还是挺多的,如果你是从tauri1迁移过来的话,估计要走的坑更多,因为tauri2的配置很多已经和tauri1不一样了,如果你还是习惯用tauri1的配置思维来搞tauri2的话,肯定会让你很难受。附上tauri2常用的几个链接:官方javascript的api文档:window|Tauri ......
  • Python面试常见问题及答案11
    问题:Python中如何删除列表中的重复元素?答案:可以使用set函数,因为set是一个无序且不重复的元素集。将列表转换为set,然后再转换回列表即可去除重复元素。例如:a=[1,2,4,2,4,5,6,5,7,8,9,0];b=set(a);c=list(b),此时c为去重后的列表。问题:Python中的lambda函数是什么?它有什......