【问题标题】:Object defined by an anonymous function, how does it work? [duplicate]由匿名函数定义的对象,它是如何工作的? [复制]
【发布时间】:2023-03-16 09:56:01
【问题描述】:

我在一次在线讲座中看到了这一点,我想知道 return 声明是怎么回事?

myAcessors = (function() {
  var data = "data";
  var getData = function() {
    console.log(data);
  };
  var setData = function(val) {
    data = val;
  };
  return {
    getData: getData,
    setData: setData
  };
})();

【问题讨论】:

    标签: javascript interface return


    【解决方案1】:

    实际上这种技术称为closure,它基本上是一个自初始化函数,(在这种情况下)返回一个对象并封装方法上下文。

    myAcessors 中的函数/变量定义,例如data,是为了模拟私有方法私有变量。将它们视为无法从闭包函数外部访问的静态变量。

    为了进一步解释,如果你看一下ECMAScript 2015 class 语法,myAcessors 看起来像这样:

    class myAcessors {
      static data = 'data';
    
      getData = () => {
        console.log(this.data);
      };
    
      setData = val => {
        this.data = val;
      };
    }
    

    【讨论】:

      【解决方案2】:

      myAcessors 是一个包含属性getDatasetData 的对象,它们都是函数。

      myAcessors = (function() {
        var data = "data";
        var getData = function() {
          console.log(data);
        };
        var setData = function(val) {
          data = val;
        };
        return {
          getData: getData,
          setData: setData
        };
      })();

      例如,您可以调用myAcessors.getData(),它会返回"data"

      通过使用匿名函数,您可以将所有代码括在括号内。请注意,myAcessors.data 不会返回任何内容。这是因为变量数据存在于匿名函数内部,除非您提供一种方法,否则无法逃脱:即 get 方法。在您的情况下,您确实有一个 get 方法:getData,它将从闭包内返回变量。

      您可以说您的属性是私有的,因为没有 get 方法就无法访问它们。

      在 JavaScript 中声明对象的更常见方式是:

      myAcessors = {
        data: "data",
        getData: function() {
          console.log(this.data)
        },
        setData: function(data) {
          this.data = data
        }
      }

      但在这里 myAcessor.data 确实会返回该属性。这次与其他对象不同,您可以访问对象之外的所有myAcessor 属性。

      【讨论】:

      • 我以前从未见过这种语法,有什么地方可以得到更多的信息吗?
      • 这是一个匿名函数定义,可以阅读更多here
      • 我已经更新了我的答案,以阐明这与普通对象有何不同。
      • 在闭包语法中,您无法通过 myAcessors.data 访问数据,但在您的示例中,您将 myAcessors.data 暴露给最终用户。它们根本不一样。请从您的答案中删除该部分,因为它在技术上不正确。
      • @AminJafari 我已经解释了这两种方法,并清楚地表明一种方法允许包含代码,另一种则不允许。有什么问题?
      猜你喜欢
      • 2021-03-15
      • 1970-01-01
      • 2017-10-26
      • 2017-04-07
      • 1970-01-01
      • 2018-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多