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 语句没有父级,它会将变量作为属性添加到全局上下文中,在网络浏览器中恰好是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'
}());