美文网首页
Web26.闭包&定时器&BOM

Web26.闭包&定时器&BOM

作者: FiredEarthMusic | 来源:发表于2017-10-18 23:55 被阅读17次

定时器

JavaScript提供执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成

function f(){
    return 1
}
console.log( f )
console.log( f() )
function f(){}
setTimeout(f)  //这个是正确的
setTimeout(f())

如果:
function f(){
    return function(){
    }
}
setTimeout(f)     //这两个都可以
setTimeout(f())  //这两个都可以
function f(){
    return function f2(){
        return 3
    }
}
f //是一个函数
f() //是一个函数
f()() //3
function f(){
    console.log(1)
}
setTimeout(f)    //相当于一个闹钟 f为下面压的一张纸 代码都执行完毕后再看闹钟 再执行纸上的内容
console.log(2)   //结果 2 1
function f(){
    console.log(1)
}
var timerId = setTimeout(f)
console.log('id:' + timerId) //1
console.log(2)

var timerId = setTimeout(f) 
console.log('id:'+ timerId)  //2
//可以理解为 当纸从闹钟拿出来 闹钟会销毁  再设置新的闹钟
function f(){
    console.log(1)
    console.log(new Date())
}
console.log( new Date())
var timerId = setTimeout(f, 3000) 
function f(){
    console.log(new Date() - 0) //375
    console.log(1
}
vart timerId = setTimeout(f,0)  //可以理解为闹钟自带延迟
console.log(new Date() - 0)  //336  40毫秒的延迟
let timeoutID = window.setTimeout(fun[, delay, param1, param2, ...]); //[]表示可选的
let timeoutID = scope.setTimeout(code[, delay])
let timeoutID = window.setTimeout(function, milliseconds)

//第一种
function f(a,b){
    console.log(a,b)
    console.log(arguments)
}

var timerId = setTimeout(f,500,1,2) //IE只支持前两个参数 第三个不支持


//第二种
var timerId = setTimeout('console.log(1)',1000)
//第三种 暂时不管

window.clearTimeout(timereId)  //砸掉闹钟

异步

function 排队取号(){
    setTimeout(function f2(){
        return '你的号码是 233'
    },6000)
}
var function 黄牛(){

}
var result = 排队取号(黄牛) //undefined

//---------------------------------------------------

function 排队取号(黄牛){
    setTimeout(function f2(){
        黄牛('你的号码是233')
    },60000)
}
var 我的号 = undefined
function 黄牛(result){
    我的号 = result
}
排队取号(黄牛)  //undefined

//---------------------------------------------------
function 排队取号(黄牛){
    let id = setTimeout(function f2(){
        if(有号){
             黄牛.通知我(233)
        }else{
             黄牛.告诉我没号
        }       

    },3000)
    return id
}
var 我的号 = undefined
var 黄牛 = {
    name: '黄宏'
    通知我: function(result){
        我的号 = result
    },
    告诉我没拿到号: function(){
        我的号 = '没号了'
    }
}
排队取号(黄牛)

//函数是一个对象

//---------------------------------------------------
function 排队取号(通知我){
    var id = setTimeout(function f2(){
        通知我(233)
    },3000)
    return id
}

var 我的号 = undefined

function 通知我(result){
    我的号 = result
}
排队取号(通知我) //回调

//异步 不等结果  可以有回调 也可以没有回调
#BOM
Browser Object Model 浏览器对象模型
BOM没有文档,大多是约定俗称的
一般通过window对象来操作
window.history
window.history.back
window.history.forward
window.history.go(-1)  //back
window.history.go(1)  //forward
window.innerHeight  //不包含tab和地址栏
window.innerWidth
window.location
window.location.href="http://www.baidu.com" //在当前窗口打开百度  注意要写http
window.location.href="https://www.baidu.com"
window.location.href="//www.baidu.com"
window.location = "https://www.baidu.com"  href也可以不写
location.protocol  //协议
location.hostname   //域名
location.port   //端口
location.host  //域名+端口
location.pathname  //不包含?后面的
location.search  //?后面的  不包含#后面的
location.hash  //#后面的
location.origin  //源  协议域名端口号
<a href="https://www.qq.com"  target="FEM">qq</a>
window.name   //FEM  浏览器提供的更改name的API
window.navigator //关于浏览器的所有东西
window.navigator.userAgent
window.outerHeight;
window.outerWidth;
window.pageXOffset  //window.scrollX
window.pageYOffset   //window.scrollY
window.parent // 父页面的window
window.parent.name
window.screen
window.screen.availHeight  //屏幕上用来展示窗口的最大高度
window.screen.colorDepth
window.screen.height
window.screen.width
window.self   // window.self   返回window  注意! 不要乱声明全局变量
window.open()
window.open('http//baidu.com')
window.open('http://baidu.com','_self')    //当前窗口打开
window.open('http://baidu.com','_blank') //新窗口打开

let f = 'width=400px,height=400px'  //第三个参数
window.open('http://baidu.com', '_blank',f)

let f = 'width=400px,height=400px,toolbar=no,menubar=no,location=no,scrollbars=yes,resizable=yes'
window.open('http://baidu.com','_blank',f) //弹窗

window.opener.location.reload()  //打开我(弹窗)的窗口的页面刷新

题目1:下面的代码输出多少?修改代码让fnArri输出i 使用两种以上的方法

1.png

方法1:

    var fnArr = [];
    for (var i = 0; i < 10; i++){
        fnArr[i] = (function(j){
            return function(){
                return j
            }
        })(i)
    }
    console.log( fnArr[3]() );

方法2:

   var fnArr = [];
   for (var i = 0; i < 10; i++){
       (function(i){
           fnArr[i] = function(){
               return i;
           }   
       })(i)
   }
   console.log( fnArr[3]() )

方式3:

    var fnArr = [];
    for (var i = 0; i < 10; i++){
        fnArr[i] = function(){
            return i;
        }
    }
    console.log( fnArr[3]() )

题目2:封装一个汽车对象,可以通过如下方式获取汽车状态

2.png
    var Car = (function(){
        var speed = 0;
        function setSpeed(s){
            speed = s;
        }
        function getSpeed(){
            console.log(speed);
            return speed;
        }
        function accelerate(){
            speed += 5;
        }
        function decelerate(){
            speeed -= 5;
        }
        function getStatus(){
            if(speed > 0){
                console.log('still running');
            }else if(speed === 0){
               console.log('stop');
            }
        }
        return {
            setSpeed: setSpeed,
            getSpeed: getSpeed,
            accelerate: accelerate,
            decelerate: decelerate,
            getStatus: getStatus; 
        }
    })()
    Car.setSpeed(30);
    Car.getSpeed();
    Car.accerlate();
    Car.getSpeed();
    Car.decelereate();
    Car.decelerate();
    Car.getSpeed();
    Car.getStatus();
    Car.decelerate();
    Car.decelerate();
    Car.getStatus();

题目3:下面这段代码输出结果是?为什么?

3.png
    var a = 1;
    setTimeout(function(){
        a = 2;
        console.log(a); //2
    }, 0);
    var a;
    console.log(a);  //1
    a = 3;
    console.log(a); //3

    //setTimeout 会等待其他语句执行完毕后再执行
    //所以先输出第一个 a 因为先执行var a = 1 所以先打印1
    //然后输出第三个a  因为var a = 3 所以打印3
    //最后输出第二个a  a在自己函数作用域下 与外界无关
    //所以第二个a 为 2

题目4:下面这段代码输出结果是?为什么?

4.png
var flag = true;
setTimeout(function() {
    flag = false;
},0)
while(flag){}
console.log(flag);

//先跳过setTimeout
//setTimeout等待while执行完毕  flag一直为true 无限执行循环
//console.log不会执行 

题目5:下面这段代码输出?如何输出 delayer: 0, delayer:1...(使用闭包来实现)

5.png
for(var i=0;i<5;i++){
    (function(t){
        return setTimeout(function(){
            console.log('delayer:' + t );
        }, 0);
    })(i);
    console.log(i);
}

题目6:如何获取元素的真实宽高

window.getComputedStyle();

题目7:URL如何编码解码?为什么要编码?

一般来说,URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号
一般有四种情况:
1.网址路径中包含汉字
2.查询字符串包含汉字
3.Get方法生成的URL包含汉字
4.Ajax调用的URL包含汉字
不同的操作系统、不同的浏览器、不同的网页字符集,将导致完全不同的编码结果。
使用Javascript先对URL编码,然后再向服务器提交,不要给浏览器插手的机会。因为Javascript的输出总是一致的,所以就保证了服务器得到的数据是格式统一的。

//js编码方法
escape()
unescape()

无论网页的原始编码是什么,一旦被Javascript编码,就都变为unicode字符。也就是说,Javascipt函数的输入和输出,默认都是Unicode字符
encodeURI()是Javascript中真正用来对URL编码的函数。
它着眼于对整个URL进行编码,因此除了常见的符号以外,对其他一些在网址中有特殊含义的符号"; / ? : @ & = + $ , #",也不进行编码。编码后,它输出符号的utf-8形式,并且在每个字节前加上%

encodeURI()
decodeURI()

最后一个Javascript编码函数是encodeURIComponent()。与encodeURI()的区别是,它用于对URL的组成部分进行个别编码,而不用于对整个URL进行编码。
因此,"; / ? : @ & = + $ , #",这些在encodeURI()中不被编码的符号,在encodeURIComponent()中统统会被编码。至于具体的编码方法,两者是一样。

encodeURIComponent()
deencodeURIComponent()

题目8:补全如下函数,判断用户的浏览器类型

8.png
function isAndroid(){
    if(/android/i.test(navigator.userAgent)){
        console.log("The browser type is Android")
    }
}
function isIphone(){
    if(/iphone/i.test(navigator.userAgent)){
        console.log("The browser type is iphone")
    }
}
function isIpad(){
    if(/ipad/i.test(navigator.userAgent)){
        console.log("The browser type is iPad")
    }
}
function isiOS(){
    if(/(iphone)|(ipad)/i.test(navigator.userAgent)){
        console.log("The browser type is iOS")
    }
}

相关文章

网友评论

      本文标题:Web26.闭包&定时器&BOM

      本文链接:https://www.haomeiwen.com/subject/qyuyuxtx.html