N-ZOO / everycode

前端每日一练
163 stars 18 forks source link

高三精读小组课后作业(03期) #15

Open VaJoy opened 8 years ago

VaJoy commented 8 years ago

175-246页

答案将于一周后更新于本贴,大家可以跟帖写答案看自己对基础知识的掌握程度如何。 跟帖回答案的都应自行思考完成,不然没有任何意义

1. 说出下述代码的结果,并说说为什么:

    f = function(){
        return true
    };
    g = function(){
        return false
    };
    (function(){
      if(g() && []==![]){
          f = function(){
              return false
          };
          function g(){
              return true
          }
      }
    })();
    alert(f()); //true or false?

2.请定义一个函数repeat:

function repeat (func, nums, times) {
      //TODO: 完成该函数
}
//该函数可以这么使用:
var a = repeat(alert, 6, 3000);
a("你好");  //alert六次 "你好", 每次间隔3秒

3.听说过斐波那契数列吗?很多笔试题上都会出现它的哦。

斐波那契数列又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、…
它有这样的一个递归关系:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)(n≥2,n∈N*) 那么请你用js写一个递归函数,打印出一串斐波那契数列吧:

function fibonacci(n){
   //TODO: 完成该函数
}
var r1 = fibonacci(2);
var r2 = fibonacci(6);

console.log(r1); //0,1,1
console.log(r2); //0,1,1,2,3,5,8

4.请写一个函数,让它能正确返回浏览器视口(viewport)宽度和高度:

function getVpSize(){
    //TODO: 完成该函数
}
var vpSize = getVpSize();
console.log( vpSize .width, vpSize .height );  //能正确打印出视口宽高

5.完成一个跨窗口的DOM操作

在一个页面(比如a.html)中打开一个新窗口b.html(如果被浏览器阻止,请设置浏览器不要拦截它,然后再刷新页面,即确保能正常打开新窗口),然后在a.html中通过脚本修改新开页面b.html中的div背景颜色为红色。(写出a.html页面的实现脚本即可) b.html示例代码:

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>b页面</title>
</head>
<body>
<div>123</div>
</body>
</html>

提示:建议把俩页面放到服务器上(比如tomcat),否则在chrome上会被当作跨域页面被禁止俩页面间的操作。 另外打开新的b页面后,需等b页面的body onload后,a页面才能找到b页面的div

Yoomin233 commented 7 years ago

1 应该alert出false, 因为function g在第七行开始的匿名函数中被提升了, 导致if()表达式中的两个式子值都为true. 2

function repeat(func, nums, times){
    return function(argv){
        setTimeout(function lambda(){
           func(argv);
           if(nums--)setTimeout(lambda, times)
        }, 0)
    }
}

3

function fibonacci(len){
    var arr = [0, 1];
    for(var i = 2; i < len; i ++){
        arr[i] = arr[i-1] + arr[i-2];
    }
    return arr;
}

呆尾递归优化的递归版本:

function fibonacci(len){
    var arr = [0, 1], index = 1;
    return (function loop(arr, elem1, elem2){
        arr.push(elem1 + elem2);
        if(index++ < len){
            loop(arr, arr[index-1], arr[index])
        }
        return arr;
    })(arr, 0, 1);
}

4 现在好像都是直接用innerHeightinnerWidth了... 5 现在好像都是用postMessage...