我正在使用HTML服务开发一个应用程序,我想使用模块模式。
我不知道为什么函数内部的函数会丢失对象的引用。我不知道这是谷歌应用程序脚本服务器调用相关问题还是一般的javascript问题。
有人可以帮我找到问题吗?这是代码。
var Handshake = (function () {
var self = this;
var contacts;
google.script.run.withSuccessHandler(parse).withUserObject(this).withFailureHandler(onFailure).getContacts();
console.log("JUST CALLED GET CONTACTS");
function parse (JSONstring,parent)
{
parent.contacts = JSON.parse(JSONstring);
console.log ("Parsed info "+JSON.stringify(parent));
}
return {
contacts : contacts
}
}());
似乎Guillaume发现了问题,但我不明白为什么对象的行为如此。
如果你使它更通用,我从commandLine启动它,这就是我得到的:
var Handshake = (function () {
var self = this,contacts,parse;
parse = function (JSONstring,parent)
{
console.log(this);
this.contacts = JSON.parse(JSONstring);
console.log ("Parsed info "+JSON.stringify(this));
};
console.log("Undefined handshake?"+this);
console.log("JUST CALLED GET CONTACTS");
return {
contacts : contacts, parse:parse
};
}());
输出:
Undefined handshake?[object Window]
修改 最后我发现了问题。 正如Guillaume指出的那样, 这个 指向了窗口对象。我想我应该再次检查对象是如何工作的。将谷歌脚本调用移动到一个功能修复了这个问题。
这是功能:
init = function() {
console.log("Undefined handshake?"+JSON.stringify(this));
google.script.run.withSuccessHandler(parse).withUserObject(this).withFailureHandler(onFailure).getContacts();
console.log("JUST CALLED GET CONTACTS");
};
如果有人想解释为什么这是正确的方法,我将不胜感激。
答案 0 :(得分:2)
我不相信你丢失了对象引用,在调用google.script时,似乎(不知道更多关于调用上下文)是root windows对象。
您是否曾尝试将您的功能用作:
var parent = .. ; // myContextObject which will be used as 'this'
var HandshakeFn = function(){..};
var Handshake = HandshakeFn.call(parent);
为了澄清答案,javascript中的每个函数调用都由一个对象(上下文)拥有,该对象默认为window(根)。 当您使用
调用握手功能时Handshake = (function(){...})();
上下文'this'是调用它的对象。 因为你直接从root调用你的函数,所以函数中对'this'的任何引用都会返回一个ref到窗口。
要避免此行为,您可以使用
显式设置调用上下文HandshakeFn.call(myobject);
有了这个,'this'将引用myobject而不是window。当您将用户对象设置为googlescript时,它将在第二个“父”参数中返回正确的对象。
我建议这里避免使用谷歌脚本处理上下文和第二个参数
var Handshake = (function () {
var self = {}; // you need to explicitely create an object here !
google.script.run.withSuccessHandler(parse).withFailureHandler(onFailure).getContacts();
console.log("JUST CALLED GET CONTACTS");
function parse (JSONstring)
{
self.contacts = JSON.parse(JSONstring);
console.log ("Parsed info "+JSON.stringify(self));
}
return self;
}());
如果您觉得这很有用,请不要忘记投票。
P.S。 :对不起我的英语不好,这不是我的母语。
问候。