Javascript JSONP回调不';行不通

Javascript JSONP回调不';行不通,javascript,jsonp,Javascript,Jsonp,我编写了一个Foo构造函数,它有一个load函数用于上传JSONPscript.src有一个回调,但我有一个错误:uncaughtreferenceerror:bar未定义。我怎么能修好它 function Foo(params) { function bar(response) { console.log(response); } function load() { var script = document.createElemen

我编写了一个
Foo
构造函数,它有一个
load
函数用于上传JSONP
script.src
有一个回调,但我有一个错误:
uncaughtreferenceerror:bar未定义
。我怎么能修好它

function Foo(params) { 
    function bar(response) {
        console.log(response);
    }

    function load() {
        var script = document.createElement('script');
        script.src = Config.apiUrl + '&callback=bar';
        document.getElementsByTagName('head')[0].appendChild(script);
    }

    document.getElementById('button').addEventListener('click', load, false);
}
用法:

var foo=新foo(参数)


页面中可能有很多内容。

假设您的JSONP响应是正确的,如下所示:

bar(/*some argument*/);
问题:
bar
必须是全局可访问的,但目前它不是(它仅在
Foo
中可见)

可能的解决办法:

bar
定义为
Foo
的一种方法,然后您就可以执行它(只要实例
Foo
是全局可访问的)。在这种情况下,
callback
-参数必须设置为
foo.bar

function Foo(params) { this.bar=function(response) { console.log(response); } this.load=function(){ var script = document.createElement('script'); script.src = Config.apiUrl + '&callback=foo.bar'; document.getElementsByTagName('head')[0].appendChild(script); } document.getElementById('button').addEventListener('click', this.load, false); } //assuming you create the instance in global scope var foo = new Foo(params); 函数Foo(params){ this.bar=函数(响应){ 控制台日志(响应); } this.load=function(){ var script=document.createElement('script'); script.src=Config.apiUrl+'&callback=foo.bar; document.getElementsByTagName('head')[0].appendChild(脚本); } document.getElementById('button').addEventListener('click',this.load,false); } //假设您在全局范围内创建实例 var foo=新foo(参数);
假设您的JSONP响应是正确的,如下所示:

bar(/*some argument*/);
问题:
bar
必须是全局可访问的,但目前它不是(它仅在
Foo
中可见)

可能的解决办法:

bar
定义为
Foo
的一种方法,然后您就可以执行它(只要实例
Foo
是全局可访问的)。在这种情况下,
callback
-参数必须设置为
foo.bar

function Foo(params) { this.bar=function(response) { console.log(response); } this.load=function(){ var script = document.createElement('script'); script.src = Config.apiUrl + '&callback=foo.bar'; document.getElementsByTagName('head')[0].appendChild(script); } document.getElementById('button').addEventListener('click', this.load, false); } //assuming you create the instance in global scope var foo = new Foo(params); 函数Foo(params){ this.bar=函数(响应){ 控制台日志(响应); } this.load=function(){ var script=document.createElement('script'); script.src=Config.apiUrl+'&callback=foo.bar; document.getElementsByTagName('head')[0].appendChild(脚本); } document.getElementById('button').addEventListener('click',this.load,false); } //假设您在全局范围内创建实例 var foo=新foo(参数); 简短答复:

您应该使
bar
函数全局可用,或者使其成为
Foo
实例的公共方法,该实例应该全局可用

由于存在该错误,您知道您需要一个返回有效javascript代码字符串的服务器,如:

alert('JSONP in action'); bar('result');
根据您的
/?callback=bar
请求

因此,由于
JSONP
只是页面上的一个普通脚本加载,它与html头部加载的任何其他.js文件具有相同的可变可访问性规则,显然,您无法从不同的.js文件访问“私有函数”

但“保存条形函数参考以备日后使用”功能又如何呢 (关闭)

  • 你可以问
这里不适用,因为bar函数调用的范围是从Foo构造函数外部创建的——bar函数是从“不同的文件”调用的,所以这里没有闭包

更好的解决方案:

假设您需要进行跨源请求(
CORS
),并且您可以在服务器端应用程序中进行更改,最好在您尝试从不同域名应用程序访问的服务器上设置
Access Control Allow Origin
规则。这将允许您使用常规的
XHR
请求,并有更多关于http状态码的信息,或发送自定义的不同请求。

简短回答:

您应该使
bar
函数全局可用,或者使其成为
Foo
实例的公共方法,该实例应该全局可用

由于存在该错误,您知道您需要一个返回有效javascript代码字符串的服务器,如:

alert('JSONP in action'); bar('result');
根据您的
/?callback=bar
请求

因此,由于
JSONP
只是页面上的一个普通脚本加载,它与html头部加载的任何其他.js文件具有相同的可变可访问性规则,显然,您无法从不同的.js文件访问“私有函数”

但“保存条形函数参考以备日后使用”功能又如何呢 (关闭)

  • 你可以问
这里不适用,因为bar函数调用的范围是从Foo构造函数外部创建的——bar函数是从“不同的文件”调用的,所以这里没有闭包

更好的解决方案:


假设您需要进行跨源请求(
CORS
),并且您可以在服务器端应用程序中进行更改,最好在您尝试从不同域名应用程序访问的服务器上设置
Access Control Allow Origin
规则。这将允许您使用常规的
XHR
请求,并有更多关于http状态码的信息或发送自定义的不同请求。

如何调用构造函数,JSONP看起来如何?您好!用法
var foo=新foo(参数),看起来像json。如何调用构造函数,JSONP看起来像什么?嗨!用法
var foo=新foo(参数),看起来像json。嗨!谢谢您的回答,但它在页面中可能不止一个。请将实例的名称(foo、bar等)作为参数提供给构造函数,然后您可以根据实例名称hi动态创建回调参数!谢谢您的回答,但它在页面中可能不止一个。请将实例的名称(foo、bar等)作为参数提供给构造函数,然后您可以根据实例名称动态创建回调参数