回调函数域JSONP的原理介绍

本文介绍了JSONP(JSON with padding)的基本概念及其如何解决跨域问题。通过具体案例展示了JSONP的工作原理,同时对比了JSONP与Ajax的区别,并列举了其他几种解决跨域的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先声明,我是一个菜鸟。一下文章中出现技巧误导情况盖不负责

    1.JSOP存在的必要性   参考1 ,2

  Ajax数据的获取须要遵循同源的策略,也就是须要使用相同的域名、端口、协议,所以要想获取不同域的数据就存在问题。因此基于此问题就衍生出了很多解决Ajax跨域的技巧,譬如:服务器代理、img、iframe等等技巧。 JSONP是JSON with padding的缩写。

    


 

    2.JSONP的原理

  在当地创建一个回调函数,然后在跨域段调用该回调函数,并将JSON数据作为参数传递给回调函数,实现回调。

    


 

    3.案例解析

  a.html须要跨域解决问题

  

<script>
    function aa(data){
         alert(data.message);
   }

   function loadScript(url){
       var script  =  document.createElement('script');
       script.setAttribute('type','text/javascript');
       script.src = url;
       document.body.appendChild(script);
  }

  window.onload = function(){
     
    var a = document.getELementById('aaa');
    a.onclick = function(){
        var url = "http://b.html?callback=aa";
        loadScript(url);
    }
  }
</script>
    每日一道理
记不清有多少个夜晚,在我翻阅纸张的指间滑落;记不清有多少支蜡烛,在我的凝视中化为灰烬。逝者如斯,我时时刻刻会听见自己对生命承诺的余音,感到岁月的流转在渐渐稀释我的年少无知,我愿自己是一只上足了发条的时钟,在昼夜不停的流转中留下自己充实的每一刻。
在b页面,执行回调函数,并将json数据作为参数填充到回调函数中,实现回调函数  
1.获取回调函数
2.然后执行回调函数
  var  data = {

     "message" :"sucess"
  }

  callback(data);

     4.Ajax技巧与JSONP技巧的差别

   1.两种技巧“看起来”很像,目标一样,都是请求一个URL,然后对从服务器端获取的数据停止处理;

   2.Ajax技巧的核心是通过XMLHttpRequest对象来获取数据,而JSONP通过动态创建script,然后在服务器端执行回调函数实现数据的获取,采取的是两种完整不同的技巧;

   3.区分不在于是不是跨域,jsonp也可以解决同域的数据获取。

    


    5.解决跨域的其他方法

  iframe、服务器代理、图片等等

文章结束给大家分享下程序员的一些笑话语录: 苹果与谷歌之争就是封闭收费与自由免费思想之争。(别急着把google来膜拜哦?那可是一家公司,以赚钱为目标的公司!当年我Party就是这样把广大劳动人民吸引过来的。今天的结果你们都看到了。)


<think>好的,用户现在想了解声明函数作用变量的关键字有哪些。根据提供的引用内容,我需要先回顾一下用户提到的参考资料,然后结合之前的对话内容来组织回答。 首先,用户给出的引用[1]提到var和let的区别,其中var是函数作用,而let是块级作用。引用[2]展示了var的变量提升现象,而引用[5]则指出var声明的变量会成为全局对象的属性,而let不会。引用[3]和[4]讨论了全局变量、函数作用以及闭包的相关内容,特别是var在函数内的作用范围。 用户之前的问题是关于CSS选择器优先级,现在转向JavaScript的作用问题,说明可能在学习前端开发的基础知识。用户明确询问“声明函数作用内变量的关键字有哪些”,需要明确回答哪些关键字用于函数作用,同时可能需要对比其他作用的关键字。 根据引用内容,var是函数作用的关键字,而let和const是块级作用。但用户的问题集中在函数作用,所以主要回答var。不过,可能需要指出在ES6之前,只有var具有函数作用,而ES6引入了let和const,但它们是块级作用。此外,引用[3]提到不使用任何关键字声明的变量会成为全局变量,这也需要注意。 需要确保回答结构清晰,分点列出关键字,并说明每个关键字的作用特性。同时,结合用户提供的引用内容,特别是引用[1]、[2]、[5]来支持回答。比如,var的变量提升、函数作用,以及全局对象属性等特性。同时,对比let和const,说明它们的不同之处,避免用户混淆。 另外,用户可能存在的深层需求是理解不同关键字的作用差异,以便在编码中正确使用,避免作用相关的错误。例如,变量提升可能导致意外结果,或者全局变量污染的问题。因此,在回答中需要强调这些实际应用中的注意事项,并给出示例代码帮助理解。 最后,根据用户之前的示例,需要生成相关问题,可能涉及变量提升、作用链、闭包等,以帮助用户进一步学习。同时,确保引用正确,比如引用[^1]、[^2]、[^5]来支持各个观点,增强回答的可信度。</think>### 声明函数作用变量的关键字详解 根据引用[^1][^4][^5]的描述,**JavaScript 中声明函数作用变量的核心关键字是 `var`**。以下是详细解析和对比: --- #### 一、函数作用专用关键字:`var` 1. **作用范围** - 通过 `var` 声明的变量具有函数作用,即变量在整个函数体内有效(包含嵌套代码块) - 示例(引用[^4]): ```javascript function foo() { var a = 1; // 作用覆盖整个foo函数 if (true) { var b = 2; // 同样属于foo函数作用 } console.log(a, b); // 输出:1 2 } ``` 2. **变量提升特性** - `var` 声明的变量会提升到函数顶部初始化值为 `undefined`(引用[^2]) ```javascript function test() { console.log(x); // undefined(而非报错) var x = 10; } ``` 3. **全局对象绑定** - 在全局作用使用 `var` 时,变量会成为 `window` 对象的属性(引用[^5]) ```javascript var globalVar = 10; console.log(window.globalVar); // 10 ``` --- #### 二、其他作用关键字的对比 | 关键字 | 作用类型 | 特性对比(与var的区别) | 示例场景 | |--------|-----------------|--------------------------------------|---------------------------| | `let` | 块级作用 | 仅在`{}`代码块内有效(引用[^1]) | 循环计数器、条件判断内部 | | `const`| 块级作用 | 声明后不可重新赋值 | 常量声明、对象固定引用 | | (无) | 全局作用 | 未声明直接赋值会创建全局变量(引用[^3])| 应避免使用(易污染全局命名空间) | --- #### 三、核心差异验证 1. **作用边界对比** ```javascript function demo() { if (true) { var functionScoped = "var变量"; let blockScoped = "let变量"; } console.log(functionScoped); // 正常输出(函数作用) console.log(blockScoped); // ReferenceError(块级作用) } ``` 2. **重复声明验证** ```javascript var x = 10; var x = 20; // 允许重复声明(无报错) let y = 10; let y = 20; // SyntaxError(禁止重复声明) ``` --- #### 四、最佳实践建议 1. **优先使用 `let/const`**(ES6+标准) - 避免变量提升导致的意外行为 - 减少全局污染风险(引用) 2. **仅在需要函数作用时使用 `var`** - 例如:需要在整个函数内共享变量 3. **避免隐式全局变量** - 所有变量都应显式声明(引用[^3]) --- ### 相关问题 1. `var` 的变量提升机制如何影响闭包行为? 2. 为什么现代开发中推荐用 `let/const` 替代 `var`? 3. 如何通过作用链理解闭包访问外部变量?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值