函数中的局部变量

时间:2012-08-02 01:13:18

标签: javascript

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

var myVar = 'something';

window 对象的属性(如果它在全局范围内)。

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

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

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

我想知道,谢谢。

3 个答案:

答案 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'
}());