javascript中挂载自定义方法有五种方式:直接赋值window(仅浏览器,易污染)、iife封装挂载(推荐传统项目)、vue 2挂载prototype、vue 3用globalproperties或provide/inject、es模块导出(现代标准,推荐)。

在 JavaScript 中,全局作用域挂载自定义方法,本质是让函数能在任意地方通过简单名称(如 myFn())或全局对象属性(如 window.myFn())直接调用。但方式不同,风险和适用场景差异很大,不能一概而论。
直接赋值给 window(仅限浏览器环境)
这是最直白的做法,适用于快速原型、脚本调试或极简项目:
- 在全局作用域中写:
window.formatDate = function(date) { return date.toISOString().split('T')[0]; }; - 之后任何地方都能调用
formatDate(new Date())或window.formatDate(new Date()) - 注意:
var fn = function(){}声明也会自动挂到window上,但const/let声明的函数不会
使用 IIFE 封装后挂载(推荐用于传统项目)
避免污染 window 顶层,同时确保执行时机可控:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
(function (global) { global.$utils = { debounce: function(fn, delay) { /*...*/ } }; })(typeof window !== 'undefined' ? window : globalThis);- 统一入口管理,比如所有工具函数都收在
$utils下,降低命名冲突概率 - 兼容浏览器和 Node.js(用
globalThis替代硬编码window或global)
Vue 项目中挂载到 Vue.prototype(仅限 Vue 2)
让组件实例内可通过 this 直接访问,属于框架级“伪全局”:
- 在
main.js中:Vue.prototype.$http = axios;或Vue.prototype.$toast = function(msg) { /*...*/ }; - 组件中直接写:
this.$toast('操作成功'); - Vue 3 已废弃此方式,应改用
app.config.globalProperties或组合式 API +provide/inject
ES 模块导出 + 统一入口导入(现代标准做法)
真正解耦、可 tree-shaking、无污染,适合绝大多数新项目:
- 新建
src/utils/index.js:export function sleep(ms) { return new Promise(r => setTimeout(r, ms)); } - 在需要的地方导入:
import { sleep } from '@/utils'; sleep(1000); - 如需“类全局”效果,可在根组件或
main.js中一次性导入并挂到某个命名空间对象上(非window),例如:const AppUtils = { sleep, formatDate, ... };
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










