JavaScript是否为函数范围内声明的项具有变量?我想使用关联数组访问函数内声明的项。
例如,我可以使用全局范围内的项目执行以下操作
var globalVar = "hi";
var myFunction = function () {
alert(window["globalVar"]);
};
但我想对函数
中声明的变量做类似的事情 var myFunction = function () {
var funcVar = "hi";
alert(func["funcVar"]);
};
我意识到做这样的事情并不一定是件好事,我正在做下面的事情,但我仍然对JavaScript有这样的变量感兴趣。
var myFunction = function () {
var func = {funcVar : "hi" };
alert(func["funcVar"]);
};
答案 0 :(得分:3)
这个问题已被多次询问和回答。 不,在JavaScript中没有包含局部变量作为属性的本地对象(例如,在浏览器环境中,window
对象包含全局变量作为属性)。
根据您要完成的任务,可能有许多其他方法可以攻击它,包括您现在正在使用的方法。
重复Javascript: Get access to local variable or variable in closure by its name,How can I access local scope dynamically in javascript?,Javascript local variable declare。
答案 1 :(得分:2)
也许您可以为函数对象本身分配属性,并引用它们?
var myFunction = function() {
myFunction.funcVar = 'hi';
alert(myFunction['funcVar']);
};
这不是你问题的答案,但这是我能想到的最好的方法来访问局部变量作为对象的属性。请注意,在此方法中,这些变量将以相同的方式在函数外部可见(即,查找函数的属性)。
如果您确实需要隐藏这些属性,可以将它们隐藏在闭包中,如下所示:
var myFunction = function() {
(function hidden() {
hidden.funcVar = 'hi';
alert(hidden['funcVar']);
})();
};
答案 2 :(得分:1)
函数只是可以调用的特殊对象。您可以设置函数的属性,稍后再获取它们。
var a = function () {
alert(a.testingVar);
};
a.testingVar = "asdf";
a();
DEMO: http://jsfiddle.net/gEM7W/
虽然我没有理由/需要这样做。您始终可以使用闭包来保持特定于函数的局部变量。例如:
var a = (function () {
var obj = {
testingVar: "asdf"
};
return function () {
alert(obj.testingVar);
};
})();
a();
答案 3 :(得分:0)
你真的没有关联数组。你有索引数组,你有对象。
将来会有一个迭代器,可以愉快地遍历两者,没有任何副作用。那时,也许人们会忘记差异。
但是,这些属性仍然不是基于订单的:
$arr = array(0, 1, "name"=>"Bob", 3);
在另一种语言中,可能会为您提供一个数组,其中键为:0, 1, "name", 3
在JS中,你得到0, 1, 2, "name"
(或"name", 0, 1, 2
)。
因此坚持使用索引数组和具有属性的对象。
那就是说,你有多种选择。
var myFunc = function () {
var private_data = {
name : "Bob",
age : 32
};
return {
getName : function () { return private_data.name; /* or private_data["name"] if that's really what your heart longs for */ },
get : function (key) { return private_data[key] || null; },
set : function (key, val) { private_data[key] = val; }
};
};
现在一切都是私有的,您可以使用点或括号表示法通过property-name访问它们。
如果它们可以是公共的,并且函数总是被称为相同的东西(即:不是构造函数的实例)那么你可以将自己附加到实际的函数:
var myFunc = function () {
myFunc.name = "Bob";
myFunc["age"] = 32;
return {
get : function (key) { return (myFunc.hasOwnProperty(key)) ? myFunc[key] : null; }
};
};
下行(或上行)是myFunc
是公共名称。因此,这些属性可以公开访问。
走第一条路线,你甚至不需要申报变量。您可以使用传递给函数的对象。
var myFunc = function (dataObj) {
return {
getName : function () { return dataObj.name; },
setAge : function (val) { dataObj["age"] = val; }
};
};
var bob = myFunc({ name : "Bob" });
bob.setAge(32);
现在一切都是私人的,我甚至不需要申报任何东西 只要有一个可公开访问的函数返回,Closure就会保持对象的运行,该函数仍然可以访问函数调用的特定实例。
一旦你弄清楚闭包,这就成了一个问题。