JavaScript回调函数原理与JSONP跨域实战

作者:木棉

时间:2026-10-22

浏览:500

本文深入解析JavaScript回调函数的概念与应用场景,通过生活实例阐明其工作原理。重点探讨JSONP跨域请求中jsonpCallback参数的使用细节,包括大小写敏感性及错误处理机制的局限性,为开发者提供实用的跨域解决方案参考。

文章目录

JavaScript回调函数原理

本文通过具体实例解析JavaScript中回调函数的使用方法,旨在为读者提供清晰的参考与学习思路。

在开发开源项目时,回调函数是常见组件。深入理解其机制,有助于更好地掌握开源项目的内部逻辑与架构。

关于回调函数的定义,可参考百度百科的解释。

回调函数是指通过函数指针进行调用的函数。当将函数的地址作为参数传递给另一个函数,并利用该指针调用所指向的函数时,即构成回调。它不由实现方直接调用,而是在特定事件或条件触发时由第三方调用,以响应该事件或条件。

概念较为抽象,以下通过知乎上的一个经典案例进行说明。

假设你去商店购物,发现商品缺货,于是留下电话号码。几天后商品到货,店员打电话通知你,你随后到店取货。在此场景中,电话号码即为回调函数;留下电话的行为是登记回调函数;商品到货是触发回调事件;店员打电话是调用回调函数;到店取货则是响应回调事件。

这种理解方式更为直观。当店员对象被创建时,它并不知晓具体会有哪些顾客购物,因此需要与多种不同的对象交互,并适配不同类型的对象,此时回调函数便发挥了重要作用。

JSONP跨域请求实战

通过一个具体事例来进一步理解回调函数的实际应用场景。

假设Me需要完成一项任务:计算1+1的结果。

如果Me选择自行完成这项任务。

具体实现代码如下:

HTML 代码部分


<div class="imgDiv">
  <div class="search">
    <input class="put" type="text" id="keyWord"/>
    <ul id="tipList"></ul>
</div>

JavaScript 代码部分


(function (){
  $(function(){
  $("#keyWord").on("keyup",function(event){
    var keyCode = event.keyCode;
    if(keyCode == 38|| keyCode ==40){
      settingTipList(keyCode);
      return false;
    }
    var keyWord = $(this).val();
    getTipList(keyWord);
  });
  var index = -1;
  function settingTipList(keyCode){
    if(keyCode == 38){
      index--;
    }else{
      index++;
    }
    var size = $("#tipList li").size();
    index =index % size;
    $("#tipList li").removeClass("active").eq(index).addClass("active");
    var selectLiContent = $("#tipList li").eq(index).html();
    $("#keyWord").val(selectLiContent);
  };
  //获取数据
  function getTipList(keyWord){
    var url = "https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su";
    var data = {
      wd:keyWord,
      cb:"hhh"
    };
    $.ajax({
      url:url,
      data:data,
      type:"GET",
      dataType:"jsonp",
      jsonpCallback:"hhh",
      success:function(data){
        var tipList = data.s;
        handleData(tipList)
      },
      error:function(error){
        alert("接口出错")
      }
    });
  }
  });
  function handleData(tipList){
    var tipHTML= "";
    for(var i in tipList){
      var text = tipList[i];
      tipHTML += "<li>"+text+"</li>"
    }
    $("#tipList").css({"opacity":"1"});
    $("#tipList").html(tipHTML);
  }
})()
//如果不写jsonpCallback、后面jsonpCallback“”空置、直接跳出“接口出错了。

关键注意事项

需要注意以下关键点:

1. 在使用ajax进行JSONP跨域请求时,由于被请求方的回调函数名称无法修改,而当前页面可能存在多个不同的JSONP请求,且它们的回调函数名称均相同,_Callback。此时尝试设置AJAX的JSONP参数,但发现该设置无效。最终偶然发现jsonpcallback是区分大小写的,必须使用jsonpCallback而非jsonpcallback;

2. JSONP是构建Mashup应用的强大技术,但并非解决所有跨域通信需求的万能方案,在投入开发资源前需慎重评估其缺陷。首先,也是最重要的一点,JSONP调用缺乏错误处理机制。若动态脚本插入成功,则执行调用;若失败,则静默失败,无任何提示。例如,无法从服务器捕获404错误,也无法取消或重启请求。若长时间无响应,只能忽略。(未来jQuery版本可能增加终止JSONP请求的功能)。JSONP的另一个主要缺陷在于安全性:当使用不受信任的服务时,风险较大。由于JSONP服务返回的JSON响应包裹在函数调用中,而该函数由浏览器执行,这使得宿主Web应用更容易遭受各类攻击。因此,使用JSONP服务前,必须充分了解潜在威胁。

如需了解更多JavaScript相关内容,可查阅本站专题:《JavaScript常用函数技巧汇总》、《javascript面向对象入门教程》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》及《JavaScript数学运算用法总结》。

希望本文所述内容对大家的JavaScript程序设计有所帮助。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章