首页 > 技术文章 > 愚人节都没人骗,做几道题骗骗自己

xiao-hong 2014-04-02 00:13 原文

2014过去四分之一了,回忆过去,把握现在,展望未来,总结三部曲。

又是好久没写博客了,也不回忆过去,展望未来,就把握一下现在。

恰好今天又是愚人节,写一篇博客,来安慰自己,并没有整天无所事事~ 

也快到清明节了,祭奠一下即将逝去的大学漫无追求的生活

 

今天下午第二节有课,抱着一本厚厚的书,来到教室,找个角落坐下了,本以为自己是个good goog study ,day day up的好学生,但结局总是意料之内,情理之中,玩了整整两节课的游戏终于熬过去了,但是!! 游戏一个记录都没破。拖着身子,还是原来的书,还是原封不动的纸,went back。

一天又在我的指尖逝去,真是闲得无聊。

看我没事,学长给我除了一道题,具体忘了大致题意是:有[1-52] 52个数,随机分成4组,用js 实现。一听题,浅显易懂,肯定巨简单,反正闲的,have a try !

整理思路:用随机函数依次随机生成52个随机数,范围[1,52],每组13个,4组,wow~~ just do it。。反复,反复。。。终于终于......做出来了,oh ~ yean!~

给学长展示了一下,没看代码,看了一下功能,不错~功能实现了,没出错误,但是但是。。。时间花了一个小时!!!

那我也挺满足的,至少我做出来了,代码附上,大家观摩一下:

var objApp = {
//生成随机数 selectFrom:
function(lowerValue, upperValue) { var choices = upperValue - lowerValue + 1; return Math.floor(Math.random() * choices + lowerValue); },
// 功能实现 play:
function() { var len = 0,n,obj = {}, arr =[]; while (len < 52){ n = this.selectFrom(1, 52); if (!obj.hasOwnProperty(n)){
//此处不用数组而用对象,好处:减少一次循环嵌套 不然得 while (obj.indexOf(n) != -1) 了,再者,js也讲究一切皆对象,这一串好像是谁说的来着。。。。 obj[n]
= n; arr[arr.length] = n; len++; } } for(var i=0; i<52; i++){ document.write( parseInt(arr[i], 10)," " ); if(i%13 === 0 && i!==0) document.write("<br/>") } } }; objApp.play();

不错吧,可是我一个小时的成果。

话还没说完,接下来我该羞愧到无地自容了。

学长花几分钟来着?代码多长再加上打字速度,自个儿算算。

附上另一个实现方法:

var a0 = [], a1 = [], a2 = [], a3 = [], arr = [];
for(var i=0; i<52; i++){
   arr[i] = i+1; 
}
for(var i= 52; i>0; i--){   //这块必须这样 很巧妙:i等于多少,恰好arr的length是多少。
   var m = i%4;  //为了获取每次的0,1,2,3
   var num = arr.splice(Math.floor(Math.random()*i),1); //将[1,i] i个数随机删除一个数
   eval("a"+m).push(num[0]); //将删除的那个数付给a0,a1,a2,a3
//eval("a"+m) 将字符串转换成js程序 是不是终于发现了eval()用武之处,不管你是不是,反正我是~· 又学会了一招,哈哈~
}
console.log(a0);console.log(a1);console.log(a2);console.log(a3); 

到这看再看看自己花一个小时精挑细选的代码,算了,别丢人现眼了,还是回山上再次好好修炼吧。。。

如此被虐,再来一道,来挽回一丢丢的颜面

for(var i=0; i<5; i++){
   setTimeout(function(){
     console.log(i);
   },100)
}  //来猜猜,运行结果是啥呢???

答案是什么呢????  0,1,2,3,4,5 ??? 5个undefined???还是啥呢,好好想想,可别再丢人了丫。。左思右想。。。居然是55555。

tell me why!!!

for(var i=0; i<5; i++){   
   setTimeout(function(){
     console.log(i);
   },100)
}  //5,5,5,5,5  
  // 每100ms执行的是function(){console,log(i);} 然而i是多少呢??等于多少就从作用域查找.what is the meaning of '作用域'??  
// J
ust remember a word: 作用域由定义是决定,与执行环境无关。看看在哪定义的,而此时i等于多少,在循环中定义,但此时。。。此时。。。i=5了
// so... answer: 5 5 5 5 5  understand??

居然是5,5,5,5,5 其实我是想实现输出0,1,2,3,4  怎么修改它!

for(var i=0; i<5; i++){
    setTimeout(function(j){
       console.log(j);
    },100,i)
}; // 0,1,2,3,4  OK  实现了,但是总感觉那里不对劲~~  换个方式

for(var i=0; i<5; i++){
    (function(j){
       setTimeout(function(){
          console.log(j);
       },100)
    })(i)  
}; //0,1,2,3,4  虽然实现是一样的,但是换了方式,赶觉很高级的样子。
 好吧,再来一道

一个数组里装着各种网址,让你把正确能访问的网址选出来用数组装着。 ps:可以用jquery。

怎么实现???思来想去 ,我咋知道哪些网站是可以访问,你又不让我在浏览器上试一遍,逗我玩呢...

What am i supposed to do??

提供一个方案好了:用$.ajax()把每个网址测试一下好了,代码:
var newarr = [];
["www.baidu.com","weibo.com","http://jquery.com/jquery-wp-content/themes/jquery/images/gauze.png","1231dfdfb.com"].forEach(function(elem){
   $.ajax({
      url: elem,
      type:"get",
      success:function(res){
          newarr.push(elem);
      },
      error: function(err){
     }
   });
}); //无法实现

想了一下感觉好像还不错的样子,试了一下,www.baidu.com 居然变成了不能访问,必须错了,除非你网络有问题,正常baidu不可能无法访问。原来,原来:ajax虽然有很多好处,好处是啥来着?异步,局部更新,来个实验巩固一下:

var a = 0;
var newarr = [];
["www.baidu.com","weibo.com","http://jquery.com/jquery-wp-content/themes/jquery/images/gauze.png","1231dfdfb.com"].forEach(function(elem){
   $.ajax({
      url: elem,
      type:"get",
      success:function(res){
         a = 12;
  
      },
      error: function(err){
       a = 13
     }
   });
   console.log(a);  //这块输出的是什么呢 ???  答案是 0, 0, 0, 0   原因:异步导致的。异步是啥?去翻汉语字典
}); 

 

但是,ajax是不能跨域请求,肿么办?? 突然想到好像script标签可以实现跨域。

<script src="http://lib.sinaapp.com/js/jquery/1.7.2/jquery.min.js"></script> //这样是可以跨域的

等等,好像有个叫jsonp这个东东,修改代码:

["www.baidu.com","weibo.com","http://jquery.com/jquery-wp-content/themes/jquery/images/gauze.png","1231dfdfb.com"].forEach(function(elem){
   $.ajax({
      url: elem,
      type:"get",
      dataType : "jsonp",
      jsonp: "callbackparam",
      success:function(res){
          newarr.push(elem);
      },
      error: function(err){
     }
   });
});  //无法实现

貌似还是不行,因为我们不知道 人家的 callbackparam 到底叫什么,总不能我们随便去,唉~ 就是自己取了也是白搭。

貌似实现不了,怎么办??

好像有个complete方法,如何实现。。。。。

凌晨了,洗洗睡吧。。不能耽误浪费了白天的大好阳光。。。

 

不对的地方或者更好的方法,欢迎各位纠正补充~

ps:愚人节都过了,都没有被表白,说明真的没人爱了… 默默滚回去敲代码、、、

推荐阅读