介绍依赖注入是什么以及一个小例子。
平时经常使用的bind()、call()和apply()就是依赖注入,可以先依靠这三个函数来体会一下依赖注入究竟是什么。
然后可以看一下知乎上的这个回答:跳到知乎回答
后来我又看了一篇文章,但是并没有讲得特别详细。
在这里增加一些注释和记录学习的知识点。
// 主要看看这段代码
DI.prototype.inject = function (func) {
var deps = /^[^(]+\(([^)]+)/.exec(func.toString());
// 构建参数绑定数组
deps = deps ? deps[1]
.split(/\s?,\s?/)
.map(function (dep) {
return this.dependency[dep];
}.bind(this)) : [];
// 通过apply将依赖参数传入函数
return function () {
return func.apply(this, deps);
};
}
exec()检索字符串中的指定值。返回值是被找到的值。如果没有发现匹配,则返回 null。这段正则使用了分组,所以deps[0]匹配整个正则表达式,deps[1]匹配([^)]+)
因为匿名函数里面的this不是DI
function (dep) {
return this.dependency[dep];
}
所以需要用bind(this)注入this给匿名函数。
也可以用如下写法
var that = this; // 在外面用一个变量指向this
deps = deps ? deps[1]
.split(/\s?,\s?/)
.map(function (dep) {
return that.dependency[dep];
}) : [];