Javascript 对象';当我通过ajax发送它时,有人调用了s方法,而我从来没有调用过它?

Javascript 对象';当我通过ajax发送它时,有人调用了s方法,而我从来没有调用过它?,javascript,jquery,Javascript,Jquery,我有一个名为Entry的简单对象,它直到最近才有几个基本属性。在某些事件中,我将对这些对象执行REST操作,并将其发送到C#代码中的API。直到最近,这一切都很顺利。我会使用我的little request服务将这些对象发布或放置在AJAX请求体中,结果如下: $.ajax(url, { type:method, headers:headers, data:options.data, //there is an instance of Entry in options.

我有一个名为
Entry
的简单对象,它直到最近才有几个基本属性。在某些事件中,我将对这些对象执行REST操作,并将其发送到C#代码中的API。直到最近,这一切都很顺利。我会使用我的little request服务将这些对象发布或放置在AJAX请求体中,结果如下:

$.ajax(url, 
{
    type:method,
    headers:headers,
    data:options.data, //there is an instance of Entry in options.data
    timeout: this.timeoutLength
});
最近我在条目中添加了一个函数

function Entry(foo, bar){
    this.foo = foo;
    this.bar = bar;
    this.doStuff = function(){ ... } //added this code
}
我添加了该功能,但再次质疑了其使用背后的用户故事,因此我切换回浏览器,刷新并运行了更多测试。没有在任何地方调用函数
doStuff
,就可以看到它的效果


我用一个简单的警报替换了doStuff的主体,并且确信每次我在幕后使用Entry对象执行一个称为AJAX请求的操作时,我都会收到警报消息。这到底是为什么?为什么在我没有告诉它的情况下调用了
doStuff

Edit:tldr;Ajax在序列化对象时调用对象中的任何函数。如果您关心原因,请继续阅读:

这让我有点疯狂,直到我成功地将堆栈跟踪向后。jquery-1.7.1.js
$.ajax
似乎正在调用函数
doStuff
。但是为什么呢

这里讨论的对象“entry”必须序列化为查询字符串,以便通过网络发送。在执行此操作时,它将遍历对象的每个属性

首先,(在第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是数组,jQuery将基于传统设置的值(如下所述)使用相同的键序列化多个值


最后,通过一个简单的测试(不是完全阅读代码),似乎
JSON.stringify
完全忽略了函数;Ajax在序列化对象时调用对象中的任何函数。如果您关心原因,请继续阅读:

这让我有点疯狂,直到我成功地将堆栈跟踪向后。jquery-1.7.1.js
$.ajax
似乎正在调用函数
doStuff
。但是为什么呢

这里讨论的对象“entry”必须序列化为查询字符串,以便通过网络发送。在执行此操作时,它将遍历对象的每个属性

首先,(在第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是数组,jQuery将基于传统设置的值(如下所述)使用相同的键序列化多个值


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

同时询问和回答?你是什么,机器人?@bpeterson76在发帖时从未注意到“回答你自己的问题,问答式”选项?事实上,我一直在思考这个问题,所以我认为分享它既有趣又有用,以防其他人遇到它。考虑添加更多细节,我不知道发生了什么,也不知道它叫什么。我唯一能看到的是
完整的
,当然这就是所谓的。@Esailija谢谢你的建议。删除了
complete
,因为这是一个令人费解的问题,并在此处命名了有问题的函数。希望在同一时间提问和回答更清晰?你是什么,机器人?@bpeterson76在发帖时从未注意到“回答你自己的问题,问答式”选项?事实上,我一直在思考这个问题,所以我认为分享它既有趣又有用,以防其他人遇到它。考虑添加更多细节,我不知道发生了什么,也不知道它叫什么。我唯一能看到的是
完整的
,当然这就是所谓的。@Esailija谢谢你的建议。删除了
complete
,因为这是一个令人费解的问题,并在此处命名了有问题的函数。希望它更清楚