有几种方法可以去这里。有些是好主意,有些则不是。
一、一些不好的想法
馊主意:arguments.callee.name
这最直接地转化为您的要求。arguments.callee
是对您当前使用的函数的引用。但是,这被认为是不好的做法,
除非您有充分的理由,否则您应该避免使用它。
坏主意:咖喱
构造函数后,将自己的名称作为参数绑定到其中:
var functions_collection = {
"function_x": function(name) {
alert(name);
},
//more functions
};
for (var name in functions_collection) {
if (typeof functions_collection[name] === "function") {
functions_collection[name] =
functions_collection[name].bind(functions_collection, name);
}
}
柯里化对 JavaScript 中的很多东西都很有用,在很多情况下它都是一个好主意。不过,不在这里,我将在下面解释原因。
坏主意:使用本地参数并遍历包含对象
var functions_collection = {
"function_x": function(name) {
alert(name);
},
//more functions
};
for (var name in functions_collection) {
if (typeof functions_collection[name] === "function") {
functions_collection[name](name);
}
}
当然,这个明显的问题是您可能不想一次调用集合中的每个函数。更根本的问题是它延续了危险的紧耦合趋势。这是一件坏事,可能是一件非常糟糕的事情,这会让你感到头疼。
现在是“正确”的方式
改变你的整个方法。忘记尝试从 HTML 中回收类名;保持简单。
好主意:使用局部变量
谁在乎你给你的函数起什么名字?如果您知道希望它们接触哪些 HTML 类,只需按这种方式编写代码即可。
var functions_collection = {
"function_x": function() {
var name = "function_x"; //or "button" or any other class name
alert(name);
},
//more functions
};
functions_collection.function_x();
好主意:传递一个参数
你已经在调用这个函数了,对吧?因此,可能已经有代码可以访问您想要的名称。
var functions_collection = {
"function_x": function(name) {
alert(name);
},
//more functions
};
functions_collection.function_x("function_x"); //or any other class name
现在您可以function_x
在 HTML 中的任何类上使用,即使它与函数名称不匹配:
functions_collection.function_x("function_y");
functions_collection.function_x("class_z");
functions_collection.function_x("button");
我把最简单的留到最后,因为我认为你试图变得“聪明”是个错误,如果这是有道理的话。您的方法存在重大风险,而且回报不值得。
为什么坏主意是坏的,好主意是好的
除了arguments.callee.name
选项之外,在这种情况下,原因 2 和 3 不好是紧耦合。你正在耦合function_x
到 ; 的结构functions_collection
。您将行为耦合到变量名;最糟糕的是,您将 JS 变量耦合到 HTML 元素的类名。这会让你的代码变得非常脆弱,当你想要改变一些东西时(你会的),准备好迎接一个充满伤害的世界。
例如,如果您重新组织 HTML 会发生什么?该页面可能会中断,因为您的 JS 的结构必须与 HTML/CSS 中的类匹配。您将不得不重命名或重写functions_collection
以及所有其他人都喜欢它,否则您将不得不围绕已有的 JS 仔细规划新的 HTML。
如果你想使用 JS 缩小器会发生什么?取决于,但如果你允许它更改对象文字中的成员名称,它会完全破坏一切,你必须从一个“好”的想法重新开始。
现在,你得到什么来换取这种僵化?您在每个函数的开头保存一个额外的行。不值得,恕我直言。咬紧牙关,保持简单。