基础 - 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:*");

  

 

posted @ 2016-09-05 15:28  WeWeZhang  阅读(162)  评论(0编辑  收藏  举报