我是Javascript的新手,最近需要支持它。愿任何人帮我理解以下编码吗?
var proj = proj || {};
(function () {
var functA = function () {
var base = {}; // I don't understand from this line
base.getString = this.getString;
this.getString = function () {
var strings = base.getString.call($this);
return strings.concat(["ab","cd","ef"]);
};
};
})();
我对getString函数很困惑。任何人都可以解释它的目的吗?此外,有没有这种编码风格的名称或任何人可以引导我一些关于这种编码风格的文章?
非常感谢。
答案 0 :(得分:1)
在Javascript中,花括号定义范围(如方法定义中)和对象类型(Ruby人称之为哈希,Python人称之为词典)。您感到困惑的一句话就是将变量声明为空对象。
之后,程序员正在为他们的新对象添加一个函数。 Javascript抛出引用就像疯了一样,所以程序员将base.getStrings
设置为指向稍后定义的getStrings函数的别名。
至于函数本身的目的,我最好的猜测是它生成了测试数据,但是如果不了解整个代码库就不可能了,
行var strings = base.getStrings.call($this)
似乎是使用来自另一个范围的字符串来播种该方法。我无法知道$this
所指的是什么,但是直觉告诉我它是对外部范围的this
的引用,它也有getStrings
方法。
call()
方法执行该功能并强制将this
关键字解析为第一个参数,在本例中为$this
。由于base.getStrings
别名为this.getStrings
,程序员可以使用此技巧强制调用$this.getStrings
,避免无限递归。
答案 1 :(得分:0)
对于我来说,这看起来像是一个混合模式的超级电话。假设this
和$this
引用已经有getString
方法返回字符串数组的对象。
现在,当在该对象上调用functA
时,它将创建一个base
对象,并在其上存储原始 this.getString
函数。然后,它将使用自己的定义覆盖 this.getString
方法。
该方法的新版本将call
base.getString
对象上的原始函数(称为$this
),并返回其结果但略有修改(由"ab","cd","ef"
数组元素。)
var base = {}; // I don't understand this line
实际上并非绝对必要。也可以直接将原始函数直接存储在变量中,不需要创建这个base
对象:
function functA() {
var original_getString = this.getString;
this.getString = function new_getString() {
var strings = original_getString.call(this);
return strings.concat(["ab","cd","ef"]);
};
}