我知道变量是其他对象的属性。例如:
var myVar = 'something';
是窗口对象的一个属性(当然,如果它在全局范围内)。
如果我想找到变量的对象,我只使用这个变量。但:
function f() {
var myVar2 = 'something';
}
myVar2属于哪个对象?(myVar属于window对象,但是myVar2呢?)
我想知道,谢谢。
我知道变量是其他对象的属性。例如:
var myVar = 'something';
是窗口对象的一个属性(当然,如果它在全局范围内)。
如果我想找到变量的对象,我只使用这个变量。但:
function f() {
var myVar2 = 'something';
}
myVar2属于哪个对象?(myVar属于window对象,但是myVar2呢?)
我想知道,谢谢。
它不属于一个对象。它属于函数的范围f
。myVar
您可以通过 inside 访问它f
。您无法在f
.
如果你做了
function f() {
this.myVar = 1;
}
现在你可以做
var myF = new f();
myF.myVar
实际上,这有时是定义用户定义对象的方式。
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
.
这是唯一一次 usingvar
将创建一个属性。如果要创建对象的属性,您只需设置它:
(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'
}());
myVar2
属于局部范围(的f
)和myVar
全局范围。