我对术语“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());
答案 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函数位于其自己的闭包中(查看本地标题变量)。请注意,如果您创建了类似
return this.title + " " + artist;
使用“this”关键字,然后concat函数将查看对象上的公共属性(您以后可以更改它)。
您可以将var title = song;
行视为创建“私有”属性。它只能从对象内部访问。这绝对是一种简化的观察方式。如果您想更多地了解正在发生的事情,您必须了解JavaScript范围和闭包。
http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/