4

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

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

你能像这样重写它吗:

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

因为那样你就不需要继续写this哪个更好了。这两段代码做同样的事情吗?

非常感谢。

4

4 回答 4

11

使用this

这将创建一个对象的属性。它是公开的,具有读写访问权限。根据调用函数的方式(使用new?),this将指向不同的对象。 更多关于这里的主题。

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 
}
于 2013-04-04T13:04:42.927 回答
4

它们是不相同的。在第一个示例中,您正在创建一个在对象上调用的新属性barfoo这意味着您可以这样做以从函数外部访问分配的值(用作对象构造函数):

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

在第二个示例中,您正在创建一个名为的变量,该变量bar在函数之外是不可访问的。

于 2013-04-04T13:04:10.347 回答
0

不同之处在于您的函数范围内是否有 otehr 函数,如下所示:

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

    $.ajax({
      [....],
      success : function(response) {
           alert(bar);//not works
           alert(foo);//works
      }
      });
};
于 2013-04-04T13:05:06.713 回答
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
};
于 2013-04-04T13:05:20.160 回答