我有类似的东西:
var a = (function () { return { b: 1,c: function () { console.log(this.b); } }; })();@H_301_4@所以,
a.c(); // = 1@H_301_4@但如果我这样做
b = 2; a.c.apply(this); // = 2@H_301_4@是否可以在“a.c()”中保留“this”的上下文而不改变(太多)“a”对象的结构?我没有对函数调用的控制,所以我需要一个解决方法来处理对象本身内部的这个问题. @H_301_4@更新: @H_301_4@更具体地说,这是我的文件的结构: @H_301_4@结构1(单身模式):
var a = (function () { var _instance; function init() { return { b: 1,c: function () { console.log(this.b); } }; } return { getInstance: function () { if (_instance === undefined) { _instance = init(); } return _instance; } } })();@H_301_4@结构2:
var b = { c: 1,d: function () { console.log(this.c); } };@H_301_4@解: @H_301_4@我已经实现了一个基于Mahout的答案的解决方案,将return语句拆分为init(),因此在任何情况下对于对象上下文(和实例)都是安全的. @H_301_4@对于单身人士模式:
var a = (function () { var _instance,self; function init() { return self = { b: 1,c: function () { console.log(self.b); } }; } return { getInstance: function () { if (_instance === undefined) { _instance = init(); } return _instance; } }; })();@H_301_4@对于对象文字:
var b = (function () { var self; return self = { c: 1,d: function () { console.log(self.c); } }; })();@H_301_4@所以
a.getInstance().c(); // 1 a.getInstance().c.apply(this); // 1 setTimeout(a.getInstance().c,1); // 1 $.ajax({ complete: a.getInstance().c }); // 1
解决方法
您可以稍微更改从匿名函数返回对象的方式:
var a = (function () { var result = {}; result.b = 2; result.c = function() { console.log(result.b); }; return result; })();@H_301_4@这应该具有相同的效果,但它确实消除了这种使用. @H_301_4@如果你不能改变这么多的结构,那么你可以(更多)更危险地使用:
a.c.apply = function() { // Stops the apply function working on a.c by overriding it return a.c(); }@H_301_4@如果你选择这个,虽然你必须警惕,任何时候使用a.c.apply它将不再“按预期”工作 – 它将解决这里提出的问题.