WordPress插件JS代码疑问:函数声明与调用等技术咨询
先把你贴的代码整理成更清晰的格式:
jQuery(document).ready(function(a){ function e(e,i){ a(".lwa-loading").remove(); i = a(i); e.result === !0 ? statement1 : statement2; } });
作为刚接触JS/jQuery的新手,能盯着插件代码抠细节已经超棒了!咱们逐个拆解你遇到的这些问题:
问题1:代码第一行使用a(...function(a){...})而非$有什么优势?我发现a(...)和$(...)都能获取元素。
这是为了避免$符号冲突!很多其他JS库(比如Prototype、MooTools)也会把$作为核心函数名,如果WordPress同时加载了这类库,直接用$就会触发报错。把jQuery对象传入ready回调并命名为a,相当于给jQuery起了个“专属别名”——在这个回调函数内部,a完全等价于jQuery(也就是你熟悉的$),既保证代码正常运行,又不会和其他库“抢地盘”。
问题2:第二行中函数名e与其第一个参数同名,这样写的原因是什么?
说白了这就是作者的个人编码习惯,没有特殊语法必要性。在JS里,函数内部的参数会“覆盖”外部同名的变量/函数(局部作用域优先级更高),所以在function e(e,i){...}内部,e指的是第一个参数,而不是函数本身。这种写法虽然合法,但可读性很差,非常容易让人混淆——大概率作者只是图省事用了单字母命名(压缩后的JS经常这么干),如果是未压缩的源码,这其实是个不太好的写法。
问题3:第四行的i=a(i)是什么意思?
这行是把参数i转换成jQuery对象!a是jQuery的别名(也就是$):如果传入的i是原生DOM元素(比如document.getElementById拿到的节点)或者CSS选择器字符串,a(i)会把它包装成jQuery对象,这样之后就能调用jQuery的各种便捷方法(比如.hide()、.attr())了。举个例子:如果i是document.querySelector('#my-element'),执行i=a(i)后,i就变成了$('#my-element'),可以直接用jQuery API操作它。
问题4:第五行中e.result里的e指代的是函数e还是其第一个参数?另外===!0是什么含义?
首先,e.result里的e是函数的第一个参数——因为函数内部的参数作用域优先级更高,同名的函数名e在这里被参数覆盖了。然后===!0完全等价于===true:!0是逻辑非运算,0在JS里属于“假值”,取反后就是true。作者这么写可能是个人习惯,或者是为了和某些返回布尔值的API保持一致,两者效果完全相同。
问题5:我看到作者调用了e.result、e.error和e.message,这些是什么?是事件对象属性吗?我未找到它们的定义和用法。
这些大概率是插件作者自定义的回调对象属性,不是原生JS或jQuery的事件对象属性。从代码上下文来看,这个e参数应该是某个异步操作(比如AJAX请求)完成后传递过来的结果对象——通常这类对象会包含操作的状态信息:result标记操作是否成功(比如true代表成功),error标记是否发生错误,message则是对应的提示文本。你可以去查找调用这个e函数的地方(也就是哪里执行了e(...)),就能看到传入的e对象具体结构了。
内容的提问来源于stack exchange,提问作者ArruckT

