HuangHongRui / Notebook

:pencil2: Yeah.. This's My NoteBook...:closed_book:
0 stars 0 forks source link

闭包_定时器_BOM #8

Open HuangHongRui opened 7 years ago

HuangHongRui commented 7 years ago

发现简书很麻烦...

下面的代码输出,修改代码让 fnArr[i]() 输出 i。

var fnArr = [];
 for (var i = 0; i < 10; i ++) {
 fnArr[i] = function(){
 return i;
 };
 }
 console.log( fnArr[3]() ); 
 //此为原题
 //输出等于10 .因为全局就只有一个i = 10..return的也是全局的这个值.​

方法一:

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

方法二:

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

方法三:

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

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

var Car = (function(){
   var speed = 0;
   function setSpeed(s) {
       speed = s
   }
   ...
   return {
      setSpeed: setSpeed,
      ...
   }
})()
Car.setSpeed(30);
Car.getSpeed(); //30
Car.accelerate();
Car.getSpeed(); //40;
Car.decelerate();
Car.decelerate();
Car.getSpeed(); //20
Car.getStatus(); // 'running';
Car.decelerate(); 
Car.decelerate();
Car.getStatus();  //'stop';
//Car.speed;  //error

下面这段代码输出结果

var a = 1;
setTimeout(function() {
    a = 2;
    console.log(a);
}, 0);
var a ;
console.log(a);
a = 3;
console.log(a);
//输出结果:
//输出: [1] 原因:前面 [var a = 1][var a (多余声明)]很好理解,唯一问题就落在定时器[setTimeout]这里.它会等其他函数执行完再执行.
//输出: [3] 原因:前面 [a = 3] 赋值于全局 得出此结果
//输出: [2] 原因:定时器 [setTimeout] 的 [a = 2] 赋值于全局 a 

下面这段代码的输出结果

var flag = true;
setTimeout(function() {
    flag = false;
},0)
while(flag){}
console.log(flag);
//跳过定时器[setTimeout]最后执行
//循环(条件:true){内容}.没终止的条件_致死循环
//console.log:等着..永远轮不到...  

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

for(var i=0;i<5;i++) {

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

    (function (i) {
        setTimeout(function(){
            console.log('delayer:' + i );
        }, 0);
    })(i)

    console.log(i);//0 1 2 3 4 5
}

如何获取元素的真实宽高

首先我们要获取元素节点,var node = document.querySelector('#id'),然后利用window对象的getComputedStyle来获取相应的css属性,比如:window.getComputedStyle(node).height/width返回的是相应的宽高,单位为像素.

URL 如何编码解码?为什么要编码?

  • 编码的方式有两种,第一种是使用encodeURI();参数为一个url字符串或字符串对象,通过这种方式编码的url相比encodeURIComponent()编码的将会把元字符和语义字符之外的字符,都进行转义,而后者除了语义字符之外的字符,元字符也会被转义。因此,它的参数通常是URL的路径或参数值,而不是整个URL。

  • 编码的作用无非就是为了使用起来更加方便轻巧且易于区分,避免造成误会比如当我门要返回一个网址的时候,?back=xxx&value = return.这样便不会把后面的value也当成了前一个网页的参数值.

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

    var test = window.navigator.userAgent;
    console.log(test);
    function isAndroid(){
     if(/Android/i.test(test)){
        return console.log('isAndroid');
     }
    }
    function isIphone(){
        if(/iPhone/i.test(test)){
            return console.log('isIphone');
        }
    }
    function isIpad() {
        if(/iPad/i.test(test)){
            return console.log('isIpad');
        }
    }
    function isIos(){
        if(/iPad/i.test(test)){
            return console.log('isIpad');
        }
    }
    function isMac() {
        if(/Macintosh/i.test(test)){
           return console.log('isMac');
        }
    }
    isAndroid();
    isIphone();
    isIpad();
    isIos();
    isMac();

=====