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中有关在参数...
之前添加&
的内容
谢谢!
答案 0 :(得分:3)
我不确定你在这里问的是什么,但它的开箱即用就像你想要的那样。
由于ECMAscript具有功能范围,变量a
,b
和c
将在abc()
的函数上下文中进行本地解析。这些的外部声明
变量名称(让我们称之为自由变量)永远不会被访问,因为查找过程将首先在其* 中找到这些名称拥有上下文,解决它们并停在那里。
如果您只想设置属于父上下文的自由变量,您可能应该重命名形式参数以方便然后传递值
function abc(some, other, name) {
a = some;
b = other;
c = name;
}
希望宣布a
,b
和c
的父范围不是全局范围。由于几个原因,这非常正确地被认为是不良做法和业力。
答案 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();