当我通过 ajax 发送它时,对象的方法正在被调用,而我从未调用过它
Object's method is being called, without me ever calling it, when I send it via ajax?
我有一个简单的对象叫做Entry
,直到最近才有几个基本属性。 在某些事件期间,我会对这些对象执行 REST 操作,以存储在 C# 代码中的 API。直到最近,这还很好。我会使用我的小请求服务将这些对象发布或放入 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
没有我告诉它就被召唤了?
编辑:TLDR;Ajax 在序列化对象时调用对象中的任何函数。如果您关心原因,请继续阅读:
这让我有点疯狂,直到我设法向后跟踪堆栈跟踪。 似乎doStuff
函数是由jquery-1.7.1调用的.js $.ajax
。但是为什么?
有问题的对象,此处的"entry",必须序列化为查询字符串,以便通过网络发送。 在这样做时,它会遍历对象的每个属性。
首先,(对我来说在第 7610 行)它检查对象是否isPlainObject
.以前可能是这样,但拥有功能不再如此。相反,它会执行以下操作:
jQuery.each( a, function() {
add( this.name, this.value );
});
它早一点定义了添加,如下所示:
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 中。请参阅进程数据选项以防止此自动处理。对象必须是键/值对。如果 value 是一个数组,jQuery 会根据传统设置的值序列化具有相同键的多个值(如下所述)。
最后,通过一个简单的测试(不是完全阅读代码),似乎JSON.stringify
完全忽略了函数。
- 未捕获错误:无法在初始化之前调用方法;
- 通过ajax从客户端调用C#方法来执行C#方法
- 如何避免在angular上多次调用方法;s ng重复
- React路由器错误-'无法调用方法'getRouteAtDepth'的未定义'
- 从window.onbeforeunload调用方法背后的代码
- 当输入字段为空时,如何在angular中调用方法
- 函数调用方法有什么用
- 多次调用方法后返回相同promise的模式
- 当从Chrome扩展动态注入JS时,从onload()内部调用方法
- 茉莉花 - 未调用方法
- jQuery如何在原型中调用方法
- ng显示“;调用方法“;不起作用
- Odoo销售点如何访问模型并使用JS调用方法
- 从React调用方法.JS州
- TinyMCE验证给出错误:无法调用方法'getContent'的未定义
- 向模板实例变量传递调用方法调用的结果时出现异常
- 如何在对象中调用方法
- 检查对话框是否为 Open 会引发“初始化前无法在对话框上调用方法”错误
- 在输入类型提交按钮上调用 C# 方法
- 通过类选择器单独调用方法