HTML服务中丢失了对象引用

时间:2014-05-09 08:34:45

标签: javascript google-apps-script

我正在使用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");

}; 

如果有人想解释为什么这是正确的方法,我将不胜感激。

1 个答案:

答案 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。 :对不起我的英语不好,这不是我的母语。

问候。