【问题标题】:local variables in a function [duplicate]函数中的局部变量[重复]
【发布时间】:2012-08-02 01:13:17
【问题描述】:

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

var myVar = 'something';

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

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

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

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

我想知道,谢谢。

【问题讨论】:

标签: javascript


【解决方案1】:

它不属于一个对象。它属于函数f 的范围。您可以通过在f 中执行myVar 来访问它。你不能在f之外访问它。

如果你这样做了

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

现在可以了

var myF = new f();
myF.myVar

确实,用户定义的对象有时就是这样定义的。

【讨论】:

  • 但是根据这个:11heavens.com/…一切都是对象的属性。
  • 根据某些人的说法 {} 也称为 json 对象。
  • 您应该在问题中链接了该网站。不,那篇文章的作者是错的。
  • 是的,在他的 cmets 中,有些人正在反击,实际上就是这样的例子......
  • 我们是否应该妥协:鉴于 JS 闭包的工作方式,您可以将局部函数变量描述为类似于为函数的每次调用创建的闭包的属性,但是这个“对象”不是您可以使用的对象从您的代码访问。
【解决方案2】:

myVar2 属于本地范围(f),myVar 属于全局范围。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-11
    • 2011-06-16
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 2017-10-16
    相关资源
    最近更新 更多