回调函数是由你自己在代码中定义的函数。jsonp服务器将其响应封装在一个以你指定的回调函数同名的函数调用中。
具体来说,发生了以下情况:
1)你的代码创建JSONP请求,导致生成一个新的 <script>
块,它看起来像这样:
<script src="http://server2.example.com/RetrieveUser?UserId=1234&jsonp=parseResponse"></script>
2)那个新的脚本标签会被你的浏览器执行,导致向JSONP服务器发送请求。服务器会回复:
parseResponse({"Name": "Foo", "Id" : 1234, "Rank": 7});
3) 由于此请求来自脚本标签,因此它几乎与您实际放置的完全相同。
<script>
parseResponse({"Name": "Foo", "Id" : 1234, "Rank": 7});
</script>
插入到你的页面中。
4) 现在远程服务器上的脚本已经被加载,它将会被执行,它唯一要做的就是调用一个函数parseResponse()
,并将JSON数据作为函数调用的唯一参数。
因此,在代码的其他地方,你需要:
function parseResponse(data) {
alert(data.Name);
}
基本上,JSONP 是绕过浏览器的同源策略的一种方式,通过让第三方服务器直接向您的页面注入函数调用来实现。需要注意的是,这种方法具有很高的不安全性,您要依靠远程服务是可信的且没有恶意意图。没有任何限制可以阻止不良服务返回一些 JavaScript 代码来窃取您的银行/ Facebook/ 或其他网站的凭据。例如... JSONP 响应可能是:
internalUseOnlyFunction('deleteHarddrive');
你最好不要使用parseResponse(...),如果远程网站知道你代码的结构,它可以对该代码执行任意操作,因为你已经敞开大门让该网站想干什么就干什么。