Javascript:何时以及何时不使用“this”

Phi*_*ski -1 javascript scope function this

我很好奇何时需要/最佳实践使用关键字this。我知道this在确定函数this值时会使用它,但它总是需要吗?

我问的原因是因为我有一个内部函数,它在我的模块中调用,它真正做的就是对您传递给它的一些数据进行排序。我的问题是我应该使用关键字调用这个函数this还是单独调用这个函数。

例如:

function formatSomeData(data){
  //code........
}

this.formatSomeData(data);

        OR

formatSomeData(data);
Run Code Online (Sandbox Code Playgroud)

我知道调用函数的上下文及其目的对于回答问题很重要,但在这种情况下,就像我提到的,我真的不需要在this任何时候访问该对象。调用函数时使用它仍然是一个好习惯吗?我问的并不是“这个”如何工作,而是什么时候适合使用它,什么时候不适合。

Raj*_*esh 5

何时需要/最佳实践使用关键字 this

当您想要访问某些内容时,通常会使用此方法。因此,例如,如果您有一个自定义对象并希望在某个方法中使用某些属性,则应该使用this.

function Person(fname, lname){
  this.fname = fname;
  this.lname = lname;
  this.fullName = function(){
    return this.fname + ' ' + this.lname;
  }
}

var p = new Person('foo', 'bar');
console.log(p.fullName())
Run Code Online (Sandbox Code Playgroud)

如果您看到,在当前构造函数中,我创建了一个 function( fullName) ,它需要访问fnamelname所属的对象的属性。this这是必须要用到的地方。


现在在声明时,什么时候使用this

构造函数中属于该对象一部分的任何属性都this将成为该对象的一部分。因此,如果您需要一些只能由您访问但外部无法访问的内容,您可以使用function代替this.

function Person(fname, lname){
  var self = this;
  self.fname = fname;
  self.lname = lname;
  
  // This function is private
  function getFullName() {
    var name = '';
    var seperator = '';
    if (fname) {
      name += self.fname;
      seperator = ' ';
    }
    if (lname) {
      name += seperator + self.lname;
    }
    return name;
  }
  this.fullName = function(){
    return getFullName();
  }
}

var p = new Person('foo', 'bar');
console.log(p.fullName())
Run Code Online (Sandbox Code Playgroud)


至于你的代码,我已经在评论中解释了它的工作原理:

在非严格模式下,thiswill 指向window并且任何不在函数中的声明都将成为全局范围的一部分。

但正如@Jonas W所指出的那样,这是一种不好的做法。为什么不好?

  • 任何没有声明statement( var|let|const)定义的变量都将成为全局作用域的一部分。
  • 任何函数外部具有声明语句的任何变量都将成为全局范围的一部分。