据我所知,很多javascript代码仍然使用IIFE作为其命名空间的模式,我相信javascript开发人员已经习惯了通常有一些东西之后,不要指望如果你从头开始阅读代码,你会看到所有内容;有时是空括号,有时是更多的参数。
我阅读了require.js
的一部分,并在其define
实现中看到额外的参数调整:
define=function (name, deps, callback) {
var node, context;
//Allow for anonymous modules
if (typeof name!=='string') {
//Adjust args appropriately
callback=deps;
deps=name;
name=null;
}
//This module may not have dependencies
if (!isArray(deps)) {
callback=deps;
deps=null;
}
// ..
我想更好地理解为什么以这种方式定义它,当我要定义自己的 API 时,我应该遵循这种方式吗?
规格:AMD
以随机或非常可选的顺序接受参数的函数只是给你一些语法糖。这不一定是你应该瞄准的目标,但如果它成功了,那就太好了。
我可以举一个例子,其中参数不好:
JSON.stringify(data_obj, undefined, "t");
您必须将 undefined 传递为替换函数(因为我没有替换函数,它是可选的)。当然,添加类似您发布的代码来检查第 2 和第 3 个参数的类型以将其简化为:
JSON.stringify(data_obj, "t");
在Java(不是JavaScript)中,你有多态函数,如:
public function get(String string, List list) {}
public function get(List list) {}
根据你调用get
的方式,它将调用这些实现中的任何一个。实现这些时,您可能会看到类似以下内容:
public function get(String string, List list) {
/* actual implementation */
}
public function get(List list) {
this->get("", list); // call get with default 1st argument
}
所以它并没有那么多实质内容,只是句法糖。