【问题标题】:Object's method is being called, without me ever calling it, when I send it via ajax?当我通过ajax发送对象的方法时,我没有调用它?
【发布时间】:2012-08-08 15:31:56
【问题描述】:

我有一个名为Entry 的简单对象,直到最近它还只有一些基本属性。在某些事件期间,我将对这些对象执行 REST 操作,以使用 C# 代码中的 API。直到最近,这还不错。我会使用我的小请求服务将这些对象 POST 或 PUT 到 AJAX 请求的正文中,结果如下:

$.ajax(url, 
{
    type:method,
    headers:headers,
    data:options.data, //there is an instance of Entry in options.data
    timeout: this.timeoutLength
});

最近我在Entry中添加了一个功能。

function Entry(foo, bar){
    this.foo = foo;
    this.bar = bar;
    this.doStuff = function(){ ... } //added this code
}

我添加了该功能,但再次质疑其使用背后的用户故事,因此我切换回浏览器,刷新并运行了更多测试。无需在任何地方调用函数doStuff,它的效果就会被看到。

我用一个简单的警报替换了doStuff 的正文,果然,每次我在幕后使用Entry 对象调用AJAX 请求时,我都会收到我的警报消息。为什么会发生这种情况?为什么doStuff 在没有我告知的情况下被调用?

【问题讨论】:

  • 同时提问和回答?你是什​​么机器人?
  • @bpeterson76 发帖时从未注意到“回答您自己的问题,问答风格”选项?其实I believe its encouraged
  • 我对此很头疼,所以我认为分享它既有趣又有用,以防其他人遇到它
  • 考虑添加更多细节,我不知道发生了什么以及调用了什么。我唯一能看到的是complete,当然这是被调用的。
  • @Esailija 感谢您的建议。删除了complete,因为它是一个红鲱鱼,并在此处命名了有问题的函数。希望它更清楚

标签: javascript jquery


【解决方案1】:

编辑:tldr; Ajax 在序列化对象时调用对象中的任何函数。如果你关心为什么,请继续阅读:

这让我有点发疯,直到我设法向后跟踪堆栈跟踪。 jquery-1.7.1.js $.ajax 似乎调用了函数doStuff 。但为什么呢?

有问题的对象,这里的“条目”,必须序列化为查询字符串,以便通过网络发送。这样做时,它会遍历对象的每个属性。

首先,(对我来说在第 7610 行)它检查对象 isPlainObject 是否。以前可能是这样,但是拥有一个功能不再是这样。相反,它执行以下操作:

jQuery.each( a, function() {
    add( this.name, this.value );
});

它定义了 add 稍早一点,如下所示:

add = function( key, value ) {
    // If value is a function, invoke it and return its value
    value = jQuery.isFunction( value ) ? value() : value;
    s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
};

请注意 jQuery 亲切地提供给我们的评论。它遍历对象的 每个 属性,如果一个是函数,它使用函数的返回值作为“键/值”对的“值”。它在这里调用doStuff 来获取一个值(当然返回了undefined,因为该函数只是调用了一个警报)

为了我自己,我要补充一点,文档并没有真正明确这一点。我一直认为它忽略了功能,但它肯定不会

数据对象,字符串

要发送到服务器的数据。如果还不是字符串,则将其转换为查询字符串。它附加到 GET 请求的 url。请参阅 processData 选项以防止此自动处理。对象必须是键/值对。如果 value 是一个 Array,jQuery 会根据传统设置的 value 序列化多个具有相同 key 的值(如下所述)。

最后通过一个简单的测试(不是完整阅读代码),看来JSON.stringify确实完全忽略了函数。

【讨论】:

    猜你喜欢
    • 2017-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-31
    • 2019-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多