1
var a,b,c;

function abc(a,b,c){
   console.log("a is"+ a + ", b is"+ b + ", c is"+ c);
}

a; // undefined
b; // undefined
c; // undefined

我将通过字符串a, b, c,但希望在它们通过函数后也能够访问它们。

因此,如果我调用abc("d","e","f"),我希望该函数使用这三个字符串运行,但之后,在它自己的范围之外,我还希望能够使用a="d"b="e"f="f".

有人可以解释这是如何完成的吗?我认为即使它们是在函数之外声明的,但它的同名这一事实让我失望。

我记得在 PHP 中关于&在参数之前添加的一些内容......

谢谢!

4

4 回答 4

3

我不确定你在这里问什么,但它就像你想要的那样开箱即用。

由于 ECMAscript 具有函数作用域,因此变量ab并将cabc(). 这些变量名称外部声明 (我们称它们为自由变量)永远不会被访问,因为查找过程将首先在它自己的上下文中找到这些名称,解析它们并停在那里。

如果您只想设置那些属于父上下文的自由变量,您可能应该为方便起见重命名形式参数,然后传递值

function abc(some, other, name) {
    a = some;
    b = other;
    c = name;
}

希望声明的a范围不是全局b范围。出于几个原因,这仍然被认为是不好的做法和业力,这是非常正确的。c

于 2013-02-14T23:47:05.050 回答
2

最佳做法是为内部变量赋予不同的名称,例如在它们前面加上“inner”或函数名称的首字母。然后,您不仅可以使用 simple 将值简单地分配给外部变量a = innerA,而且还可以使您的代码更具可读性。

于 2013-02-14T23:48:48.923 回答
1

如果它们被同名的函数参数屏蔽,则不能使用外部范围内的变量。

如果它们被命名为外部范围内的变量的属性,则可以。在浏览器中,全局变量实际上只是变量的属性window

var myobj = {};

function abc(a, b, c) {
    myobj.a = a;
    myobj.b = b;
    myobj.c = c;
}

// you can now use those values
于 2013-02-14T23:46:50.857 回答
1

首先,我认为你的意思是:

var a, b, c;

function abc(_a, _b, _c) {
    a = _a;
    b = _b;
    c = _c;
}

abc(1, 2, 3);
console.log("a is"+ a + ", b is"+ b + ", c is"+ c); // 1, 2, 3

鉴于此,我认为这种方法不是一个好的做法。请在闭包或命名空间中组织它们。例如,这是一个可接受的设计模式:

(function(g) {

    var _SomeClass = function(a, b, c) {
        this.a = a;
        this.b = b;
        this.c = c;
    }

    _SomeClass.prototype = {
        printValues: function() {
            console.log(this.a, this.b, this.c);
        },
        doSomething: function() {
            // do something here
        },
        _privateMethod: function() {
            // should not be called from outside the closure
        }
    }

    g.SomeClass = _SomeClass;

})(window);

var myClass = new SomeClass(1, 2, 3);
myClass.printValues();
于 2013-02-14T23:49:33.050 回答