在JavaScript中var变量是否与此不同

时间:2015-10-23 16:00:38

标签: javascript javascript-events this javascript-objects var

我对术语“var”有点混淆,并在JavaScript构造函数中使用关键字“this”声明变量。例如,在下面的代码中,“var title”是一个与“happySongs [0] .title”不同的变量。它们都是用不同的东西初始化的。 title在构造函数中初始化为song参数,title也在构造函数外部初始化。然而,他们都返回了不同的东西。如果您打印出“happySongs [0] .title”,它会为您提供新值。但是,如果你打印出concat()方法,title将没有'test'的新值,而是旧的值....所以这里有两个不同的东西?这些是单独的变量吗?在函数构造函数中声明一个带“var”和“this”的变量时会有区别吗?

function Tune(song,artist) {
  var title = song;
  this.concat = function() {
   return title + " " + artist;
 }
}

var happySongs = [];
happySongs[0] = new Tune("Putting on the Ritz", "Ella Fitzgerald");

happySongs[0].title = 'test'
//prints out test
console.log(happySongs[0].title); 

 // prints out correct title and artist
console.log(happySongs[0].concat());

3 个答案:

答案 0 :(得分:0)

var title是一个局部变量。 this.concat = function()然后"关闭"标题/艺术家变量。 this.title[0].title是对象的属性。

答案 1 :(得分:0)

他们是不同的。

      ---


      ---

      This is an R Markdown document. Markdown is a simple formatting   syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see <http://rmarkdown.rstudio.com>.

构造函数中是本地范围的变量。

var title = song;

在构建的happySongs[0].title = 'test' 对象上创建title 属性。改变一个对另一个没有影响。在构造函数中声明的Tune函数可以访问外部作用域中声明的本地作用域concat变量。如果您引用title,则会获得该属性:

this.title

如果放在原始代码中,上面会产生最后一行:

this.concat = function() {
  return this.title + " " + artist;
}

输出console.log(happySongs[0].concat());

答案 2 :(得分:0)

  

是“var title”与“happySongs [0] .title”

不同的变量

是的,它们是不同的变量。我认为,混淆的原因在于

happySongs[0].title = 'test'

在执行该行之前,happySongs [0]没有公共“title”属性。

当您从“构造函数”中声明var title = song时,您创建了一个本地范围的变量。棘手的部分是,当你创建concat函数时,JavaScript会创建所谓的“闭包”。闭包基本上是一个函数和它的环境的分组。为了运行concat,它需要知道变量“title”的含义。因此,每当调用concat时,它会查看该变量。调用函数时无关紧要,它始终会查看该局部变量。即使它在技术上“超出范围”。

调用happySongs[0].title = 'test'后,您在该对象上创建了名为“test”的实际公共属性。可以随时从对象外部访问此属性,但它不会更改concat函数,因为concat函数位于其自己的闭包中(查看本地标题变量)。请注意,如果您创建了类似

的concat函数
return this.title + " " + artist;

使用“this”关键字,然后concat函数将查看对象上的公共属性(您以后可以更改它)。

您可以将var title = song;行视为创建“私有”属性。它只能从对象内部访问。这绝对是一种简化的观察方式。如果您想更多地了解正在发生的事情,您必须了解JavaScript范围和闭包。

http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/