【问题标题】:Using this inside an Javascript IIFE within an object在对象内的 Javascript IIFE 中使用 this
【发布时间】:2017-05-06 00:14:12
【问题描述】:

我想使用this 代替 IIFE 中的对象名称。

var ops = {
   start: (function (){
      socket.on('set', function(data) { 
         ops.getData();             
    });
  }()),
  getData: function (){
      ... 
  }
};

如何实现?

【问题讨论】:

  • 为什么start 是一个 IIFE?这将在您定义此对象时执行代码。 start 将设置为 socket.on 返回的任何值
  • @Damon 不会,因为函数中没有 return 语句。 start 将设置为 undefined
  • @Banzy 这不是重点,为什么要将对象属性设置为未定义作为副作用?这里的模式通常是在对象上定义一个启动函数并在适当的时候调用该函数,否则没有理由将立即执行的代码块放在对象中。
  • 是的@Damon,它现在工作正常,但也许最好通过调用将其更改为常规函数。

标签: javascript object iife


【解决方案1】:

你不能。更不用说你的函数没有返回任何分配给ops.start的东西。

var ops = {
  start: function (){
    var self = this;
    socket.on('set', function(data) { 
      self.getData();             
    });
  }
};

ops.start();

【讨论】:

    【解决方案2】:

    您可以创建一个新对象并使用它的原型来访问“this”:

    var o = Object.create(Object.prototype, {
      data: {
        value: 12
      },
      getobject: {
        get: function() {
          return this.data;
        }
      }
    });
    
    o.getobject;
    

    【讨论】:

      【解决方案3】:

      如果需要,您可以在函数上下文中使用 getter 和闭包。 Getter 自动调用一个函数:

      var ops = {
         get start() {
            return socket.on('set', function(data) { 
               ops.getData();             
          });
        },
        getData: function (){
        }
      };
      

      现在你可以参考 ops.start

      【讨论】:

        猜你喜欢
        • 2023-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多