废话不多说, 直接上代码
(function(model){
model.m1.init();
})({
get m1(){
var
obj = {},
_ctxt = this;
// 1. 传递上下文对象
return util.model.cache(obj, _ctxt);
}
});
// util.js
var util = {
model: {
cache: function (m, c, refresh, key) {
// 这里上下文默认为 this 明显是有问题的
// 也就是说每次调用 cache() 必须传递 c 参数
// 2. 是否有更好的办法解决这个问题?
c = c || this;
var
name = arguments.callee.caller.name,
names = /\s/.test(name) ? name.match(/ (\S*)/) : [name],
k = jstAPI.valid.isString(key) ? key : ("_" + (1 === names.length ? names[0] : names[1])),
v = c[k];
if (refresh || null === v || undefined === v) {
v = jstAPI.common.invoke(c,m)||m;
if (jstAPI.valid.isObject(v))
v._ctxt = c;
c[k] = v;
}
return v;
}
}
};
想在 utils.model.cache 函数中获取**m1()**所在的上下文,
这里为 model 所指的对象,
通过 arguments.callee.caller 只能获取到m1() 这个函数,
如何获取 model 所指向的对象呢?
https://segmentfault.com/q/1010000003107212
即使通过call/apply也必须要指定context才可以, 这个方法行不通.
是否有更好的办法呢?
util.model.cache.call(this, arguments, ...);
即使通过call/apply也必须要指定context才可以, 这个方法行不通.
是否有更好的办法呢?
util.model.cache.call(this, arguments, ...);
(function(model){
model.m1.init();
})({
get m1(){
var
obj = {},
_ctxt = this;
// 1. 传递上下文对象
return util.model.cache(obj, _ctxt);
}
});
用浏览器的编译模式看看
用浏览器的编译模式看看。。。。
this的指向永远都是当前调用方,如果是高级语言你根本会不知道this的指向问题,因为你用对象.call里面的this永远不会搞不清this指向,因为js的
灵活(垃圾)写法,导致有些挂在了全局对象(比如window)上,而你调用的又辣么爽,所以就搞不清this了,在次强调this指向当前调用方,即方法的拥有者。