var self = this?

2022-08-30 01:31:30

使用实例方法作为事件处理程序的回调会将 范围从“我的实例”更改为“刚刚调用回调的任何内容”。所以我的代码看起来像这样this

function MyObject() {
  this.doSomething = function() {
    ...
  }

  var self = this
  $('#foobar').bind('click', function(){
    self.doSomethng()
    // this.doSomething() would not work here
  })
}

它有效,但这是最好的方法吗?这对我来说看起来很奇怪。


答案 1

这个问题不是特定于jQuery的,而是特定于JavaScript的。核心问题是如何在嵌入式函数中“引导”变量。下面是一个示例:

var abc = 1; // we want to use this variable in embedded functions

function xyz(){
  console.log(abc); // it is available here!
  function qwe(){
    console.log(abc); // it is available here too!
  }
  ...
};

此技术依赖于使用闭包。但它不起作用,因为它是一个伪变量,可能会从一个范围动态地变化到另一个范围:thisthis

// we want to use "this" variable in embedded functions

function xyz(){
  // "this" is different here!
  console.log(this); // not what we wanted!
  function qwe(){
    // "this" is different here too!
    console.log(this); // not what we wanted!
  }
  ...
};

我们能做些什么?将其分配给某个变量,并通过别名使用它:

var abc = this; // we want to use this variable in embedded functions

function xyz(){
  // "this" is different here! --- but we don't care!
  console.log(abc); // now it is the right object!
  function qwe(){
    // "this" is different here too! --- but we don't care!
    console.log(abc); // it is the right object here too!
  }
  ...
};

this在这方面不是唯一的:另一个伪变量应该以同样的方式处理 - 通过别名。arguments


答案 2

是的,这似乎是一个共同的标准。有些程序员使用自我,有些使用我。它被用作对“真实”对象的引用,而不是事件。

我花了一点时间才真正得到的东西,起初看起来确实很奇怪。

我通常在我的对象的顶部执行此操作(请原谅我的演示代码 - 它比其他任何东西都更具概念性,而不是关于优秀编码技术的课程):

function MyObject(){
  var me = this;

  //Events
  Click = onClick; //Allows user to override onClick event with their own

  //Event Handlers
  onClick = function(args){
    me.MyProperty = args; //Reference me, referencing this refers to onClick
    ...
    //Do other stuff
  }
}