【问题标题】:Javascript: constructor function this keyword [duplicate]Javascript:构造函数this关键字[重复]
【发布时间】:2016-10-31 23:48:06
【问题描述】:

以下两个代码段有什么区别:

function HelloService(){
  var service = this;
  service.itemList = []

  service.hello = function(){    
    return "Hello World!!";
  };

  service.addItem = function(){
    service.itemList.push(1);
  }
}

function HelloService(){
  var service = this;
  var itemList = [];

  var hello = function(){    
    return "Hello World!!";
  };

  service.addItem = function(){
    itemList.push(1);
  }

}

因为据我了解,hello 函数内部和 hello 函数外部的 this 指向同一个实例。

有人可以向 JAVA 解释上述问题吗?

编辑:我添加了一个addItem 函数。这里我不明白addItem function里面service.itemListvar itemList的区别。您能解释一下该函数内部的区别吗?

【问题讨论】:

  • this在函数内部,完全取决于你如何调用函数
  • 在第一个(带有this.hello)中,您可以从外部调用hello函数(console.log(new HelloService().hello());)。在第二个中,hello 只是一个局部变量,无法从外部访问。
  • 真的值得一读JS中“this”的确切含义。了解它几乎与 Java 中的任何类概念无关。正如 adeneo 所说,这是关于调用,而不是声明。
  • 另一方面,在第二个示例中,this 是什么并不重要,因为变量与 this 无关。
  • 函数内部和外部this是否相同无关紧要,函数创建自己的作用域,并且在该作用域中声明变量,并且由于变量是函数作用域,它们只能在该范围(或“较低”范围)内访问。

标签: javascript function-constructor


【解决方案1】:

Javascript 函数中的局部变量不会作为this 的属性添加。第一个相当于:

function HelloService(){
  this.hello = function(){    
    return "Hello World!!";
  };
}

但不是:

function HelloService(){
  var hello = function(){    
    return "Hello World!!";
  };
}

由于 hello 引用的函数从未使用过,并且在 HelloService 范围之外无法访问,因此什么都不做。

【讨论】:

  • var varName="val"; 通常仅在全局上下文中等于 this.varName="val";
  • @chiliNUT - 这与上下文或this 的值无关,而是范围。在函数内部时,即使this 是全局变量,也不会添加变量 -> jsfiddle.net/9ygu01nj
  • @adeneo 嘿,我有点困惑,我想我们意见一致,很明显为什么你的小提琴不起作用;我使用范围和上下文作为同义词,但显然你使用它们的方式不同,如果 2 个变量在同一个范围内,它们不是在同一个上下文中吗?请澄清:)
  • 即,在您的示例中,this 是全局对象,但显然您不在全局范围内,而是在函数范围内
猜你喜欢
  • 2017-12-15
  • 2012-04-15
  • 1970-01-01
  • 2019-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-26
  • 1970-01-01
相关资源
最近更新 更多