【问题标题】:'var' vs 'this' vs constructor-parameter variables [duplicate]'var' vs 'this' vs 构造函数参数变量
【发布时间】:2011-05-20 06:12:20
【问题描述】:

在javascript中给出这三个构造函数:

function Foo(data) {

  var _data = data;

}

function Bar(data) {

  this.data = data;

}

function Baz(data) {

   //just use data freely.

}

除了data 成员在构造后的可见性之外还有什么不同吗? (例如你可以做新的Bar().data,但不能做new Foo().data

【问题讨论】:

    标签: javascript oop


    【解决方案1】:

    是的,区别在于变量的存储方式。

    var 声明的变量是构造函数的局部变量。如果在作用域中声明了任何函数,它只会在构造函数调用之后继续存在,因为它会在函数闭包中被捕获。

    this.声明的变量其实不是变量,而是对象的一个​​属性,只要对象存在,它就一直存在,不管它是否被使用。

    编辑:
    如果您使用变量而不声明它们,它们将在全局范围内隐式声明,而不是对象的一部分。通常,您应该尝试限制您声明的范围,以免所有内容最终都在全局范围内。

    【讨论】:

    • 如果一个变量从未被使用过……它是否存在有关系吗?
    • 该变量将在构造函数调用中继续存在,即使它没有被任何方法使用(只要至少存在一种方法)。方法不必使用变量 - 因为它被困在方法的范围内,所以它仍然存在。
    • @Pablo:不是很多,但这是声明变量的方式不同的一种影响。
    • @Šime Vidas:好点子。有些语言设法限制闭包中包含的内容,但如果你说的是正确的,Javascript 中的闭包将包含所有局部变量。
    【解决方案2】:

    var _data = data; 创建data 的本地副本(非引用)。 this.data = data 实际上创建了对象本身的一个属性。

    我推荐阅读这篇文章(没有双关语):http://javascriptweblog.wordpress.com/2010/08/30/understanding-javascripts-this/

    【讨论】:

    • 注意:局部变量被赋值为参数的值。如果参数是对对象的引用,则局部变量也将是对同一对象的引用,而不是对对象副本的引用。
    猜你喜欢
    • 2018-01-16
    • 2012-08-11
    • 1970-01-01
    • 1970-01-01
    • 2021-03-01
    • 1970-01-01
    • 2020-02-19
    • 2011-04-26
    • 1970-01-01
    相关资源
    最近更新 更多