javascript将参数值传递给相同的命名外部范围变量

时间:2013-02-14 23:42:46

标签: javascript scope

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

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

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

有人能解释一下这是怎么做到的吗?我认为即使它们在函数之外被声明,但它的名字也同样让我失望。

我记得在PHP中有关在参数...

之前添加&的内容

谢谢!

4 个答案:

答案 0 :(得分:3)

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

由于ECMAscript具有功能范围,变量abc将在abc()的函数上下文中进行本地解析。这些的外部声明 变量名称(让我们称之为自由变量)永远不会被访问,因为查找过程将首先在其* 中找到这些名称拥有上下文,解决它们并停在那里。

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

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

希望宣布abc父范围不是全局范围。由于几个原因,这非常正确地被认为是不良做法和业力。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

如果它们被具有相同名称的函数参数掩盖,则不能在外部作用域中使用这些变量。

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

var myobj = {};

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

// you can now use those values

答案 3 :(得分: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();