我知道变量是其他对象的属性。例如:
var myVar = 'something';
是 window 对象的属性(如果它在全局范围内)。
如果我想找到变量的对象,我只使用 this 变量。但是:
function f() {
var myVar2 = 'something';
}
myVar2 属于哪个对象? ( myVar 属于 window 对象,但 myVar2 是什么?)
我想知道,谢谢。
答案 0 :(得分:2)
它不属于某个对象。它属于函数f
的范围。您可以在myVar
内执行f
来访问它。您无法在f
之外访问它。
如果你做了
function f() {
this.myVar = 1;
}
现在你可以做到
var myF = new f();
myF.myVar
实际上,这有时是如何定义用户定义的对象。
答案 1 :(得分:0)
myVar2
属于本地范围(f
),myVar
属于全球范围。
答案 2 :(得分:0)
var
做了一些有趣的事情。 var
语句被提升到其功能范围的顶部。 var
的功能范围是它恰好所处的功能。
JavaScript没有块级范围,这意味着:
(function () { //a closure to create new scope
var foo;
foo = 1;
if (condition) {
var bar;
bar = 3;
}
}());
......等同于......
(function () {
var foo,
bar;
foo = 1;
if (condition) {
bar = 3;
}
}());
如果var
语句没有父语句,它会将变量作为属性添加到全局上下文中,在Web浏览器中恰好是window
。
这是仅使用var
创建属性的 时间。如果想要创建对象的属性,只需设置它:
(function () {
var foo;
foo = {};
foo.bar = 'baz'; //this creates the `bar` property on `foo`
}());
JavaScript是一种具有原型继承的原型语言。函数是第一类对象(因为JavaScript不是对函数的种族主义)。这意味着函数可以像任何其他对象一样使用。
您可以设置它们:
(function () {
var foo;
//foo is now a function
foo = function () {
alert('Hello World');
};
}());
您可以设置它们的属性:
(function () {
var foo;
foo = function () {
alert('Hello World');
};
foo.bar = 'baz'; //this works just fine
}());
您甚至可以将它们作为参数传递:
(function () {
var foo,
bar;
foo = function () {
alert('Hello World');
};
bar = function (c) {
c();
};
bar(foo); //guess what this does?
}());
功能所做的另一件很酷的事情是它们是构造函数。所有函数都是固有的构造函数,您只需使用new
关键字调用它们:
(function () {
var foo; //case sensitive
//it doesn't matter whether you use `function Foo`
//or `var Foo = function...`
function Foo() {
alert('Hello World');
}
foo = new Foo();
foo.bar = 'baz';
}());
使用构造函数的重要细节是函数的上下文(this
)将被设置为构造函数创建的对象。这意味着您可以在构造函数中设置对象的属性:
(function () {
var foo;
function Foo() {
this.bar = 'baz';
}
foo = new Foo();
alert(foo.bar); //'baz'
}());