项目之间的 Javascript IIFE 代码共享

Posted

技术标签:

【中文标题】项目之间的 Javascript IIFE 代码共享【英文标题】:Javascript IIFE code sharing between projects 【发布时间】:2017-01-15 17:24:32 【问题描述】:

请寻找纯 javascript 的答案。

将 IIFE 用于 JavaScript 游戏。实际上多个网页上的多个游戏。假设所有这些游戏都需要使用一段通用代码。比如说,一个骰子; 1d20、3d6 等

这样做的正确方法是什么? IIFE 是否应该全部设置为具有唯一名称的全局变量?我担心设置为全局(也许我太担心了)。

骰子游戏是否需要传入 IIFE 游戏?如何正确执行此操作?

【问题讨论】:

在 2016 年,我认为您应该使用 npmbower 之类的东西,将您的源代码打包到一个可测试的小模块中,然后在您的主项目中声明您的依赖项。那么你应该使用browserifywebpack之类的东西将你的模块包含在你的代码中,var diceRoller = require('diceRoller');或ES6中import diceRoller from 'diceRoller' 我不想为 npm 上的私人服务付费。我不使用凉亭。另外,不需要节点的一部分吗?我没有使用节点。只是 javascript 和简单的 html 文件。 您可以使用私有 npm,因为它接受任何 git repository as dependency。将您的代码打包成小块是模块的用途(您可以使用commonjs,即通过require.jsbrowserify 使用require 的npm 样式...,amd 或带有import 的新ES6 东西) 你的浏览器中就会有模块! 【参考方案1】:

我认为你想要一个显示模块模式,而不是 IIFE 模式。

//Revealing Module Pattern (Public & Private) w Public Namespace 'game'
var game = (function() 

    // object to expose as public properties and methods such as game.roll
    var pub = ;

    //game.roll
    pub.roll = function () 
        //do your thing
        return randomIntFromInterval(1,6);
    ;

    function randomIntFromInterval(min,max)
        return Math.floor(Math.random()*(max-min+1)+min);
    

  //API
  return pub;
());

【讨论】:

好的,所以我应该使用 setter 来传入 diceRoller。 diceRoller 不仅仅是一个 RNG,它还具有辅助功能。你的方法可能是我应该这样做的方式。谢谢。 Revealing Module Pattern, not an IIFE Pattern 这是错误的,因为您演示的那个模块一个 IIFE。唯一认为 IIFE 是 i立即 invoked function** e 表达式,所以一般来说这个(function())() 是一个IIFE。它与显示模块(或模块模式中的任何其他排列)并没有完全不同,实际上它们都利用了它,因为 IIFE 提供了它们作为基础所需的隔离级别,然后在此基础上构建。 “[模块] 模式与立即调用的函数表达式非常相似(IIFE - 有关此内容的更多信息,请参见命名空间模式部分),只是返回的是对象而不是函数。” Learning JavaScript Design Patterns by Addy Osmani

以上是关于项目之间的 Javascript IIFE 代码共享的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript的IIFE(即时执行方法)

转换ES6中的ES5 IIFE,OOP Javascript编程

前端编码风格规范—— JavaScript 规范

JavaScript浅析IIFE的作用

JavaScript IIFE

JavaScript的函数IIFE