什么是全局污染?怎么避免全局污染?

全局污染(Global Pollution)是指在编程过程中,过度使用全局变量或对象导致命名冲突、代码可维护性下降及潜在错误增加的问题。在 JavaScript 等动态语言中,尤其需要关注全局污染的风险。

全局污染的影响

1. 命名冲突

3. 意外修改

  • 问题:当不同的代码片段(例如,不同的函数或模块)使用相同的全局
  • 示例
    var myVar = "Library A";function libraryB() {var myVar = "Library B"; // 这里虽然是局部变量,但容易混淆
    }libraryB();
    console.log(myVar); // 输出 "Library A" 但可能引发混淆
    

    2. 可维护性差

  • 问题:全局变量的存在使得代码的作用域变得模糊,尤其是在大型项目中,开发者可能不清楚某个全局变量被在哪些地方使用或修改过,增加了理解和调试的难度。
  • 示例:在多人合作的项目中,不同开发者可能会对全局变量进行不同的操作,增加了代码的复杂性和维护成本。
  • 问题:全局变量的状态可能在不知情的情况下被修改,这会导致错误和不可预测的行为,特别是在大型应用中。
  • 示例
    var sharedState = { count: 0 };function increment() {sharedState.count++;
    }function reset() {sharedState = { count: 0 }; // 可能会导致意外行为
    }
    

    避免全局污染的方法

    1. 使用局部变量

  • 建议:尽量在函数内部声明变量,以限制其作用域,避免将变量暴露到全局作用域中。
  • 示例:
    function example() {var localVariable = "I am local"; // 局部变量,不会影响全局console.log(localVariable);
    }
    example();
    console.log(localVariable); // 报错:localVariable is not defined
    

    2. 使用 IIFE(立即调用函数表达式)

  • 建议:通过 IIFE 创建一个独立的作用域,防止变量泄漏到全局。
  • 示例
    (function() {var localVariable = "I am still local"; // 仅在此 IIFE 内部可用console.log(localVariable);
    })();
    console.log(localVariable); // 报错:localVariable is not defined
    

    3. 模块化开发

  • 建议:使用模块化的方法将代码分割成不同的文件,每个模块都有自己的作用域,从而减少全局变量的使用。
  • 示例(使用 ES6 模块):
    // module.js
    export function myFunction() {console.log("This is my function");
    }// main.js
    import { myFunction } from './module.js';
    myFunction(); // "This is my function"
    

    4. 使用命名空间

  • 建议:将相关的变量和函数封装在一个对象中,从而减少全局变量的数量,增强代码的组织性。
  • 示例
    var MyNamespace = {myVariable: "value",myFunction: function() {console.log(this.myVariable);}
    };MyNamespace.myFunction(); // 输出 "value"
    

    5. 使用 let 和 const

  • 建议:在 ES6 中,使用 let 和 const 声明变量,这样变量的作用域为块级,避免全局污染。
  • 示例
    {let blockScopedVariable = "I am block scoped"; // 仅在此块内可用
    }
    console.log(blockScopedVariable); // 报错:blockScopedVariable is not defined
    

    6. 避免全局对象

  • 建议:如果可能,尽量避免直接在全局对象(如 window)上添加属性。
  • 示例:
    // 不推荐的做法
    window.myGlobalVar = "value";// 推荐的做法
    var myLocalVar = "value"; // 仅在当前作用域中有效
    

    7. 使用闭包

  • 建议:利用闭包来封装变量,使其只在特定的函数中可用,避免全局变量的使用。
  • 示例:
    function createCounter() {let count = 0; // 闭包变量return {increment: function() {count++;console.log(count);},reset: function() {count = 0;console.log("Reset to 0");}};
    }const counter = createCounter();
    counter.increment(); // 输出 1
    counter.increment(); // 输出 2
    counter.reset(); // 输出 "Reset to 0"
    

    总结

    全局污染是编程中的一个重要问题,尤其在大型项目中更为突出。通过采用局部变量、使用 IIFE、模块化开发、命名空间、ES6 的 letconst、避免全局对象以及利用闭包等方法,可以有效减少全局变量的使用,从而增强代码的可维护性和可读性。始终牢记清晰的作用域和模块化思维,有助于提升代码质量和团队协作效率。

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

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

相关文章

【C#】调用本机AI大模型流式返回

【python】AI Navigator的使用及搭建本机大模型_anaconda ai navigator-CSDN博客 【Python】AI Navigator对话流式输出_python ai流式返回-CSDN博客 前两章节我们讲解了使用AI Navigator软件搭建本机大模型,并使用python对大模型api进行调用,使其流式返…

Python Flask 框架下的 API 接口开发与封装示例

API(Application Programming Interface)接口的开发和封装是构建软件系统的重要环节。以下是关于 API 接口开发和封装的详细步骤: 一、需求分析 在开发 API 接口之前,首先需要明确接口的功能需求。这包括确定接口要提供哪些数据…

“智能科研写作:结合AI与ChatGPT提升SCI论文和基金申请质量“

基于AI辅助下的高效高质量SCI论文撰写及投稿实践 科学研究的核心在于将复杂的思想和实验成果通过严谨的写作有效地传递给学术界和工业界。对于研究生、青年学者及科研人员,如何高效撰写和发表SCI论文,成为提升学术水平和科研成果的重要环节。系统掌握从…

ProteinMPNN中DecLayer类介绍

PositionWiseFeedForward 类的代码 class PositionWiseFeedForward(nn.Module):def __init__(self, num_hidden, num_ff):super(PositionWiseFeedForward, self).__init__()self.W_in = nn.Linear(num_hidden, num_ff, bias=True)self.W_out = nn.Linear(num_ff, num_hidden, …

SAP_FICO模块-资产减值功能对折旧和残值的影响

一、业务背景 由于财务同事没注意,用总账给资产多做了一笔凭证,导致该资产金额虚增,每个月的折旧金额也虚增;现在财务的需求是怎么操作可以进行资产减值,并且减少每个月计提的折旧; 二、实现方式 通过事务码…

linux CentOs7 安装 FastDFS

CentOs7 安装 FastDFS 1. 安装依赖 yum install gcc libevent libevent-devel -y#进入src目录 cd /usr/local/src2. 安装 libfastcommon 库 libfastcommon 库是 FastDFS 文件系统运行需要的公共 C 语言函数库 # 下载 wget https://github.com/happyfish100/libfastcommon/a…

使用梧桐数据库进行销售趋势分析和预测

在当今竞争激烈的商业环境中,企业需要深入了解销售数据,以便做出明智的决策。销售趋势分析和预测是帮助企业把握市场动态、优化库存管理、制定营销策略的重要工具。本文将介绍如何使用SQL来创建销售数据库的表结构,插入示例数据,并…

6.2024.10.22

2024.10.22 2024.10.22 2024.10.22 今天没怎么学习嵌入式的,找时间补上今天学习的空缺。

qt EventFilter用途详解

一、概述 EventFilter是QObject类的一个事件过滤器,当使用installEventFilter方法为某个对象安装事件过滤器时,该对象的eventFilter函数就会被调用。通过重写eventFilter方法,开发者可以在事件处理过程中进行拦截和处理,实现对事…

go 语言 Gin Web 框架的实现原理探究

Gin 是一个用 Go (Golang) 编写的 Web 框架,性能极优,具有快速、支持中间件、crash处理、json验证、路由组、错误管理、内存渲染、可扩展性等特点。 官网地址:https://gin-gonic.com/ 源码地址:https://github.com/gin-gonic/gi…

Shell重定向输入输出

我的后端学习大纲 我的Linux学习大纲 重定向介绍 标准输入介绍 从键盘读取用户输入的数据,然后再把数据拿到Shell程序中使用; 标准输出介绍 Shell程序产生的数据,这些数据一般都是呈现到显示器上供用户浏览查看; 默认输入输出文件 每个…

重新认识Linux下的硬链接和软链接

文章目录 前言1、软链接?1.1 工作原理1.2 特点 2、硬链接2.1 工作原理2.2 特点 3、 总结 前言 让自己永远保持一颗好奇心 今天无意间听别人提到了硬链接和软链接,起初我想这么基础的知识我肯定是知道的,毕竟大学接触Linux到现在工作了那么多…

ubuntu20.04 opencv4.0 /usr/local/lib/libgflags.a(gflags.cc.o): relocation报错解决

在一个只有ubuntu20.04的docker环境中配置opencv4.0.0, 什么库都没有,都要重新安装, 其他的问题在网上都找到了解决方案,唯独这个问题比较棘手: [ 86%] Linking CXX executable …/…/bin/opencv_annotation /usr/bin/ld: /usr/lo…

前OpenAI首席技术官为新AI初创公司筹资;我国发布首个应用临床眼科大模型 “伏羲慧眼”|AI日报

文章推荐 2024人工智能报告.zip |一文迅速了解今年的AI界都发生了什么? 今日热点 据报道,前OpenAI首席技术官Mira Murati正在为一家新的AI初创公司筹集资金 据路透社报道,上个月宣布离职的OpenAI首席技术官Mira Murati正在为一…

栈和队列(一)

栈和队列的定义和特点 栈和队列是一种特殊的线性表,只能在表的端点进行操作 栈的定义和特点 这就是栈的结构,是一个特殊的线性表,只能在栈顶(或者说是表尾)进行操作。其中top为栈顶,base为栈底 栈s的存储…

C语言结构体数组 java静动数组及问题

1. (1)先声明,后定义:如上一天 //(2).声明时直接定义 #define N 5 typedef struct student { int num; int score; }STU; int main(void) { STU class3[N] { {10,90},{14,70},{8,95} }; …

全面解析:集成AWS、云原生和监控的开源运维管理平台

在当今复杂的IT环境中,寻找一个能够同时支持AWS、云原生技术(如Kubernetes)和全面监控功能的开源运维管理平台,已成为许多组织的迫切需求。本文将深入探讨几个有潜力满足这些需求的开源解决方案,分析它们的优势、局限性…

华为:高级ACL 特定ip访问特定ip命令

网络拓扑图: 网络环境: 全网互通即可 1.创建一个名为test的高级ACL acl name test advance 2.添加规则 ##拒绝所有ip访问 rule 10 deny ip source any destination 192.168.1.10 0.0.0.0 只允许特定ip访问特定ip rule 5 permit ip source 192.168.2.10…

【Vulnhub靶场】Kioptrix Level 5

目标 本地IP:192.168.118.128 目标IP:192.168.118.0/24 信息收集 nmap探测存活主机,扫全端口,扫服务 首先探测到目标ip为:192.168.118.136 nmap -sP 192.168.118.0/24nmap -p- 192.168.118.136nmap -sV -A 192.168.…

BurpSuite渗透工具的简单使用

BurpSuite渗透工具 用Burp Suite修改请求 step1: 安装Burp Suite。官网链接:Burp Suite官网 step2: 设置代理 step3: 如果要拦截https请求,还需要在客户端安装证书 step4: 拦截到请求可以在Proxy ->…