stackoverflow 上有很多经典的问题,抽时间自己整理了一下
js部分
如何从一个异步回调返回一个结果,之前在angular 里面调用服务,想返回异步回调的结果出现的问题,只能在回调中处理,不然是获取不到结果的。
function foo() {
var result;
$.ajax({
url: '...',success: function(response) {
result = response;
// return response; // <- I tried that one as well
}
});
return result;
}
var result = foo(); // It always ends up being undefined .
方法一
function foo(callback) {
$.ajax({
// ...
success: callback
});
}
方法二 promise对象
function ajax(url) {
return new Promise(function(resolve,reject) {
var xhr = new XMLHttpRequest();
xhr.onload = function() {
resolve(this.responseText);
};
xhr.onerror = reject;
xhr.open('GET',url);
xhr.send();
});
}
ajax("/echo/json").then(function(result) {
// Code depending on result 你需要做的处理放在这里,这也是之前遇到过的问题
}).catch(function() {
// An error occurred
});
这是关于闭包的问题,何为闭包,闭包就是有权访问另一个函数作用域的函数 ,js 没有块级作用域,仅仅有函数作用域。
var funcs = [];
for (var i = 0; i < 3; i++) { // let's create 3 functions
funcs[i] = function() { // and store them in funcs
console.log("My value: " + i); // each should log its value.
};
}
for (var j = 0; j < 3; j++) {
funcs[j](); // and now let's run each one to see
} //出现都是3的原因,是 i 在内部未定义,i取的是外面的值,for循环完成后 i = 3;
方法一 将作用域放在函数里面
var funcs = [];
function testCloure(i) {
return function(){
console.log("My value: " + i);
}
};
for (var i = 0; i < 3; i++) {
funcs[i] = testCloure(i);
};
for (var j = 0; j < 3; j++) {
funcs[j]();
}
方法二 ES6 let
var funcs = [];
for (let i = 0; i < 3; i++) { // let's create 3 functions
funcs[i] = function() { // and store them in funcs
console.log("My value: " + i); // each should log its value.
};
}
for (let j = 0; j < 3; j++) {
funcs[j](); // and now let's run each one to see
}
方法三 IIFE 立即执行函数
var funcs = [];
for (var i = 0; i < 3; i++) { // let's create 3 functions
funcs[i] = (function(index) { // and store them in funcs
return function(){
console.log("My value: " + index);
}
// each should log its value.
})(i);
}
for (var j = 0; j < 3; j++) {
funcs[j](); // and now let's run each one to see
}
方法四 bind 方法
function log(x) {
console.log('My value: ' + x);
}
var funcs = [];
for (var i = 0; i < 3; i++) {
funcs[i] = log.bind(this,i);
}
for (var j = 0; j < 3; j++) {
funcs[j]();
}
关于如何处理跨域问题,同源 :如果两个页面拥有相同的协议(protocol),端口(如果指定),和主机,那么这两个页面就属于同一个源(origin)。
**方法一 CORS 目前最常见,自己使用过**
设置请求头 "Access-Control-Allow-Origin" : "http://localhost:20000",服务器限制域,比如我只允许 我给的这个域访问,假如不给,浏览器就会报 XHR 跨域错误
方法二 JSONP
仅仅支持 get请求方式 比较局限,安全性有问题,对自己信任的域才能用
js高程3实现的一个例子
<script type="text/javascript">
function handleResponse(response){
console.log("IP" + response.ip + " ","city" + response.city + " ",response.region_name);
}
var script = document.createElement("script");
script.src = "http://freegeoip.net/json/?callback=handleResponse";
document.body.insertBefore(script,document.body.firstChild);
方法三 document.domain
使用document.domain来让子域安全地访问其父域,需要同时将子域和父域的document.domain设置为相同的值。必须要这么做,即使是简单的将父域设置为其原来的值。没有这么做的话可能导致授权错误。(没有尝试过)
"Access-Control-Allow-Origin": reqOrigin,
css部分
移动端部分 (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|