javascript - 如何在不访问包含范围内的内容的情况下安全地访问 Javascript 模块模式中的其他兄弟函数和变量?

标签 javascript module-pattern

我有一个按照模块模式构建的 Javascript 对象。我有几个私有(private)函数,它们是从其他同级“私有(private)”函数调用的。如何访问另一个变量/函数而不可能意外访问全局/外部变量/对象/函数?

function doSomething() {
  alert("Something I don't want to do");
}

var My.Namespaced.SingletonClass = (function() {
  var init = function() {
    doSomething();
  }

  var doSomething = function() {
    alert("Something I want to do");
  }

  return {
    "init": init;
  }
})();

My.Namespaced.SingletonClass.init();

我的猜测是上面的代码实际上会访问正确的内部 doSomething 函数,但我想要比这更高的安全性。我如何才能显式地寻址内部/嵌套函数而不用担心意外调用函数或寻址我的单例周围范围内的对象?

最佳答案

简短版:你不能。如果 doSomething 没有被定义为 init 的兄弟,那么 JavaScript 将连续搜索更广泛的范围,直到它找到一个 doSomething 函数,或者它运行超出搜索范围。

更长的版本:您可以通过使用私有(private)对象来保存您的私有(private)辅助函数来防止此类行为,如下所示:

function doSomething() {
  alert("Something I don't want to do");
}

// Assuming My.Namespaced is already defined:
My.Namespaced.SingletonClass = (function() {
  var helpers = {};

  helpers.doSomething = function() {
    alert("Something I want to do");
  }

  var init = function() {
    helpers.doSomething();
  }

  return {
    init: init
  }
})();

My.Namespaced.SingletonClass.init();

我不确定辅助函数是真正的 sibling 是否重要(但我不明白为什么这会特别重要)。

另外请记住,在添加 SingletonClass 之前需要定义 MyMy.Namespaced - 并且没有必要使用您要返回的对象中的键的 JSON 样式引用。

关于javascript - 如何在不访问包含范围内的内容的情况下安全地访问 Javascript 模块模式中的其他兄弟函数和变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3339668/

相关文章:

javascript - 检索 session 值并作为 api Ajax 所需参数传递

javascript - JavaScript 文件所需的文件扩展名

javascript - 模块模式中的私有(private)方法 : TypeError: undefined is not a function

javascript模块模式与函数

javascript - 模块模式中的构造函数

javascript - 将数据从子组件传递到父组件 - react - 通过回调函数

JavaScript - 什么时候 Array comprehension 可用于 Google Chrome?

javascript - 交叉过滤器示例不起作用

javascript - IIFE 中的变量作用域

javascript - 模块模式和闭包讨论