基础 - l提升 和 闭包 和 跨域
提升
JS代码运行的两个阶段:
预解析:把所有 变量声明 和 函数定义 提前,注意变量的赋值不会提前
执行: 从上到下执行
闭包
通俗的讲,函数去访问其他函数的局部变量
var aContaint = []; for (var i= 0,l=10;i<l;i++) { aContaint[i] = (function (key) { return function (){ console.log(key); } })(i); }
跨域
相关文档:http://www.cnblogs.com/rainman/archive/2011/02/20/1959325.html
由于JavaScript同源策略的限制,
出于安全方面的考虑,JavaScript不允许跨域通信
并且,
同一域名下的不同端口或者不同协议下也是不允许通信的,这种情况下,前台无法控制
在跨域问题上,域仅仅是通过“URL的首部”来识别,不会尝试解析域名
解决方案
方案1.动态创建script标签
原理:在页面中引用其他域的JS文件是允许的,并执行引入的JS文件中的function
定义好方法,让跨域的服务器文件返回该方法的调用;
function funCallback(array){ }
var url = "http://www.baidu.com/info.php?a=1&b=2&_jsonp=funCallback"; var oScript = document.createElement("script"); oScript.src = url; document.body.appendChild(oScript);
但是,产生了一个问题,我们如何让服务器文件返回我们写的函数名
于是,jsonp应运而生,我们在请求参数中来规定服务器文件返回的函数名
jQuery下
$(function () { $.ajax({ url: "http://localhost/20160904/07ems.php", type: "GET", dataType: "jsonp", jsonp: "_jsonp", success: function (json) { console.log(json); },error: function () { console.log("失败"); } }); });
<?php /*GET请求不缓存响应*/ header("Cache-Control:no-cache"); /*返回的字符集规范*/ header("Content-Type:text/html;charset=utf-8"); function funGET($str){ return !empty($_GET[$str]) ? $_GET[$str] : null; } function funPOST($str){ return !empty($_POST[$str]) ? $_POST[$str] : null; } $callback = $_GET["_jsonp"]; $aData = array("正","大","综","艺"); echo $callback."(".json_encode($aData).")"; ?>
解决方案2.iframe内嵌
解决方案3.服务器端解决
/*允许跨域访问*/ header("Access-Control-Allow-Origin:*");