这两个代码片段是否相同(使用var与使用此代码)

时间:2013-04-04 13:01:06

标签: javascript

我看到了一些看起来像这样的代码:

function foo(bar) {
   this.bar = bar;
};
你可以像这样重写它吗:

function foo(bar) {
   var bar = bar;
};

因为那样你就不需要继续写this更好了。这两行代码是否做同样的事情?

非常感谢。

4 个答案:

答案 0 :(得分:11)

使用this

这会创建对象的属性。它是公共的,具有读写访问权限。根据调用函数的方式(使用new?),this将指向不同的对象。 More on the subject here.

function foo(bar) {
   this.bar = bar;
};

foo(10);
console.log(bar); // bar or this.bar .. prints 10

var tmp = new foo(20); 
console.log(tmp.bar); // prints 20
console.log(bar);     // still prints 10


使用var

这会创建一个局部变量(注意:变量已经通过函数参数在范围内)。这是本地的,只能从foo函数的范围访问。

function foo(bar) {
   var bar = bar;
}


何时使用?

除非你写oo js,否则你可能想要坚持第二种选择,甚至更好 - 跳过bar的重新定义。您可以获得封装的所有常见好处。

function foo(bar) {
   // just use argument bar 
}

答案 1 :(得分:4)

他们不一样。在第一个示例中,您将在bar对象上创建一个名为foo的新属性,这意味着您可以执行此操作以从函数外部访问指定的值(用作对象构造函数):

function foo(bar) {
   this.bar = bar;
};
var f = new foo(1);
console.log(f.bar);    // => 1

在第二个示例中,您正在创建一个名为bar的变量,该变量在函数外部无法访问。

答案 2 :(得分:0)

不同之处在于,如果你的函数范围中有另一个函数,如下所示:

function foo(bar) {
   var foo = bar;
    alert(bar); //works

    $.ajax({
      [....],
      success : function(response) {
           alert(bar);//not works
           alert(foo);//works
      }
      });
};

答案 3 :(得分:0)

function foo(bar) {
    this.bar = bar; 
    // this == window -if foo()
    // this == a -if a = new foo();
};

foo('asd'); // assigns 'asd' to global variable window.bar
console.log(bar); //logs 'asd' (window.bar)

var a = new foo('asd');
console.log(a.bar); // logs 'asd'
console.log(bar); // logs undefined

function foo(bar) {
    var bar2 = bar; //bar2 acts only in scope of this function
};