0

我知道变量是其他对象的属性。例如:

var myVar = 'something';

窗口对象的一个​​属性(当然,如果它在全局范围内)。

如果我想找到变量的对象,我只使用这个变量。但:

function f() {
    var myVar2 = 'something';
}

myVar2属于哪个对象?(myVar属于window对象,但是myVar2呢?)

我想知道,谢谢。

4

3 回答 3

2

它不属于一个对象。它属于函数的范围fmyVar您可以通过 inside 访问它f。您无法在f.

如果你做了

function f() {
  this.myVar = 1;
}

现在你可以做

var myF = new f();
myF.myVar

实际上,这有时是定义用户定义对象的方式。

于 2012-08-02T01:14:56.413 回答
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.

这是唯一一次 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'
}());
于 2012-08-02T01:24:27.163 回答
0

myVar2属于局部范围(的f)和myVar全局范围。

于 2012-08-02T01:17:50.117 回答