如何使用匿名函数在 Javascript 中仅使某些函数和变量全局可用?

How to make only certain functions and variables available globally in Javascript using anonymous functions?

假设我有一个 html 结构为

的文件
<script>

let firstClass = new FirstClass();

var secret = 'code';

function FirstClass() {
    this.init = function () {
        console.log(SecondClass());
    }
}

function SecondClass() {
    return 'value';
}

</script>

// some html

<script>
    firstClass.init(); // should return a value
    console.log(secret); // should be undefined
    SecondClass(); // should not be accessible
    FirstClass(); // should not be accessible
</script>

如何确保 <script> 的第二部分仅提供 firstClass.init() 而不是 SecondClass()

我想使用匿名函数,比如;function({})();

在包含 FirstClassSecondClasssecret 且仅来自 IIFE 的 return firstClass 的 IIFE 中实例化 firstClass:

<script>
  const firstClass = (() => {
    const secret = 'secret';
    function FirstClass() {
      this.init = function() {
        console.log(SecondClass());
      }
    }

    function SecondClass() {
      return 'value';
    }
    return new FirstClass;
  })();
</script>


<script>
  firstClass.init(); // should return a value
  console.log(
    typeof secret,
    typeof SecondClass,
    typeof FirstClass
  );
</script>

注意需要使用</script>,而不是<scipt>,调用构造函数时需要使用new才能使用赋给[=18=的属性] 在构造函数中。

此代码段应该可以解决您的闭包需求。

<script>
  (function (global) {
    const secret = 'code';
    
    function FirstClass() {
      this.init = function () {
        console.log(SecondClass());
      }
      
      return this;
    }

    const firstClass = FirstClass();

    function SecondClass() {
      return 'value';
    }

    global.firstClass = firstClass;
  })(window)
</script>
// some html

<script>
  firstClass.init(); // should return a value
  console.log(typeof secret); // should be undefined
  console.log(typeof SecondClass); // should be undefined
  console.log(typeof FirstClass); // should be undefined
</script>