通过javascript执行链获取上下文对象

废话不多说, 直接上代码

(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指向当前调用方,即方法的拥有者。