我看到了一些看起来像这样的代码:
function foo(bar) {
this.bar = bar;
};
你可以像这样重写它吗:
function foo(bar) {
var bar = bar;
};
因为那样你就不需要继续写this
更好了。这两行代码是否做同样的事情?
非常感谢。
答案 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
};