使用this
或var
声明变量有什么区别?
var foo = 'bar'
或
this.foo = 'bar'
您何时使用this
和何时var
?
编辑:在决定是否要使用var
或this
时,我可以问自己一个简单的问题
答案 0 :(得分:13)
如果它是global code(代码不是任何函数的一部分),那么您在全局对象上使用两个片段创建一个属性,因为global code点中的this
到全球对象。
这种情况的不同之处在于,当使用var
语句时,无法删除该属性,例如:
var foo = 'bar';
delete foo; // false
typeof foo; // "string"
this.bar = 'baz';
delete bar; // true
typeof bar; "undefined"
(注意:以上代码段在Firebug控制台中的行为会有所不同,因为它使用 eval 运行代码,并且中执行的代码Eval Code 执行上下文允许删除使用var
创建的标识符,尝试here)
如果代码是函数的一部分,您应该知道this
关键字与函数作用域无关,是隐式设置的保留字,具体取决于函数的调用方式,例如:
1 - 当一个函数被调用为一个方法时(该函数被调用为一个对象的成员):
obj.method(); // 'this' inside method will refer to obj
2 - 正常的函数调用:
myFunction(); // 'this' inside the function will refer to the Global object
// or
(function () {})();
3 - 使用new运算符时:
var obj = new Constructor(); // 'this' will refer to a newly created object.
您甚至可以使用call
和apply
方法明确设置this
值,例如:
function test () {
alert(this);
}
test.call("hello!"); //alerts hello!
您还应该知道JavaScript只有功能范围,而使用var
语句声明的变量只能在同一个函数或下面定义的任何内部函数中访问。
修改:查看您发布到@David's answer的代码,让我发表评论:
var test1 = 'test'; // two globals, with the difference I talk
this.test2 = 'test'; // about in the beginning of this answer
//...
function test4(){
var test5 = 'test in function with var'; // <-- test5 is locally scoped!!!
this.test6 = 'test in function with this'; // global property, see below
}
test4(); // <--- test4 will be called with `this` pointing to the global object
// see #2 above, a call to an identifier that is not an property of an
// object causes it
alert(typeof test5); // "undefined" since it's a local variable of `test4`
alert(test6); // "test in function with this"
您无法访问函数外部的test5
变量,因为它是本地范围的,并且只存在该函数的范围。
修改:回复您的评论
对于声明变量,我建议您始终使用var
,这就是为此做的。
当您开始使用constructor functions,对象和方法时,this
值的概念将非常有用。
答案 1 :(得分:5)
如果使用var
,则变量的范围限定为当前函数。
如果您使用this
,那么您将为this
上的任何属性(即要调用该方法的对象或(如果new
)分配值。已使用关键字)正在创建的对象。
答案 2 :(得分:3)
var foo = 'bar'
这会将foo
变量的范围限定在包装它的函数或全局范围。
this.foo = 'bar'
这会将foo
变量范围限定为this
对象,它就像这样做:
window.foo = 'bar';
或
someObj.foo = 'bar';
你的问题的第二部分似乎是this
对象,这是由函数运行的上下文决定的。You can change what this
is by using the apply method that all functions have。您还可以将this
变量的默认值设置为全局对象以外的对象,方法是:
someObj.foo = function(){
// 'this' is 'someObj'
};
或
function someObj(x){
this.x=x;
}
someObj.prototype.getX = function(){
return this.x;
}
var myX = (new someObj(1)).getX(); // myX == 1
答案 3 :(得分:3)
如果要像在典型函数中那样定义一个简单的局部变量,则使用var
: -
function doAdd(a, b)
{
var c = a + b;
return c;
}
var result = doAdd(a, b);
alert(result);
然而,this
在函数上使用call
时具有特殊含义。
function doAdd(a, b)
{
this.c = a + b;
}
var o = new Object();
doAdd.call(o, a, b);
alert(o.c);
您注意到在doAdd上使用call
时的第一个参数是之前创建的对象。在执行doAdd this
的内部将引用该对象。因此,它会在对象上创建c
属性。
通常,虽然将函数分配给对象的属性,如下所示: -
function doAdd(a, b)
{
this.c = a + b;
}
var o = new Object();
o.doAdd = doAdd;
现在可以使用。执行该功能。符号: -
o.doAdd(a, b);
alert(o.c);
有效o.doAdd(a, b)
是o.doAdd.call(o, a, b)
答案 4 :(得分:1)
在构造函数中,您可以使用var来模拟私有成员,并使用它来模拟公共成员:
function Obj() {
this.pub = 'public';
var priv = 'private';
}
var o = new Obj();
o.pub; // 'public'
o.priv; // error
答案 5 :(得分:1)
此和 var 的示例如下所述:
function Car() {
this.speed = 0;
var speedUp = function() {
var speed = 10; // default
this.speed = this.speed + speed; // see how this and var are used
};
speedUp();
}
答案 6 :(得分:1)
var foo = 'bar'; // 'var can be only used inside a function
和
this.foo = 'bar' // 'this' can be used globally inside an object