闭包_定时器_BOM

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

var fnArr = [];
for (var i = 0; i < 10; i ++) {
    fnArr[i] =  function(){
        return i;
    };
}
console.log( fnArr[3]() );  //10,执行的时候i是全局变量10,所以整个数组元素执行后都会是10

如果想要让fnArr[i]执行后输出i,需要用函数构建一个新的局部作用域

  • 第一种方法
var fnArr = [];
for (var i = 0; i < 10; i ++) {
  var temp = function (i) {     //这里的i是新声明的形参,最终是由函数执行时传入的实参决定
    console.log(i);             //这里的i是传入的参数  执行后输出0,1,2,3,4,5,6,7,8,9
  }
  temp(i);                      //i通过传参进入temp
  fnArr[i] =  function(){
      return i;
  };
}
console.log( fnArr[3]() ); //3

整理后得到

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 ++) {
  var temp = function () {      //构建局部作用域
    return function (){
      return i;
    }
  }
  fn = temp(i);        //循环的过程中把i传入temp存值
  fnArr[i] = fn;      
}
console.log( fnArr[3]() ); //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 ++) {//使用var申明的变量在代码块外面能被识别,但是let命令却不能被识别,这样就实现了js的块级作用域,我们在使用条件语句 循环语句等就会不担心变量污染的问题了
    fnArr[i] =  function(){
        return i;
    };
}
console.log( fnArr[3]() );  //10,执行的时候i是全局变量10,所以整个数组元素执行后都会是10

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

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

   };
})();
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);    //2   作用域链 定时器被放入执行队列的最后
}, 0);
var a ;
console.log(a);        //1   作用域链
a = 3;
console.log(a);        //3   作用域链

下面这段代码输出结果是? 为什么?

var flag = true;
setTimeout(function(){       //定时器被放入执行队列的最后
    flag = false;
},0)
while(flag){}                //setTimeout会等待它执行完毕才会执行,此时flag永远是true,进入死循环。
console.log(flag);

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

for(var i=0;i<5;i++){
    setTimeout(function(){
         console.log('delayer:' + i );       ////代码会依次输出 0 1 2 3 4 ,delayer: 5 输出5次
    }, 0);
    console.log(i);
}
  • 使用闭包
for(var i=0;i<5;i++){
  setTimeout(function(i){
    return function(){
         console.log('delayer:' + i );
    }
  }(i), 0);
  console.log(i);
}

获取元素的真实宽高

function trueStyle(element,pseduoElement){
     //IE不支持window.getComputedStyle(),支持element.currentStyle();
    return element.currentStyle ? element.currentStyle : window.getComputedStyle(element,pseduoElement);
}
let trueWidth = trueStyle(element).width;
let trueHeight = trueStyle(element).height;

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

  • URL的编码/解码方法

JavaScript提供四个URL的编码/解码方法。

  1. decodeURI()
  2. decodeURIComponent()
  3. encodeURI()
  4. encodeURIComponent()
  • 区别

encodeURI方法不会对下列字符编码

  1. ASCII字母
  2. 数字
  3. ~!@#$&*()=:/,;?+'

encodeURIComponent方法不会对下列字符编码

  1. ASCII字母
  2. 数字
  3. ~!*()'

所以encodeURIComponent比encodeURI编码的范围更大。

实际例子来说,encodeURIComponent会把 http:// 编码成 http%3A%2F%2F 而encodeURI却不会。

如果你需要编码整个URL,然后需要使用这个URL,那么用encodeURI。 encodeURI("http://www.cnblogs.com/season-huang/some other thing"); //"http://www.cnblogs.com/season-huang/some%20other%20thing";

其中,空格被编码成了%20。但是如果你用了encodeURIComponent,那么结果变为

"http%3A%2F%2Fwww.cnblogs.com%2Fseason-huang%2Fsome%20other%20thing"
当你需要编码URL中的参数的时候,那么encodeURIComponent是最好方法。


var param = "http://www.cnblogs.com/season-huang/"; //param为参数
param = encodeURIComponent(param);
var url = "http://www.cnblogs.com?next=" + param;
console.log(url) //"http://www.cnblogs.com?next=http%3A%2F%2Fwww.cnblogs.com%2Fseason-huang%2F"

参数中的 "/" 可以编码,如果用encodeURI肯定要出问题,因为后面的/是需要编码的

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

function isAndroid() {
    return /Android/.test(window.navigator.userAgent);
}

function isiPhone() {
    return /iphone/i.test(window.navigator.userAgent);
}

function isiPad() {
    return /ipad/i.test(window.navigator.userAgent);
}

function isIOS() {
    return /(ipad)|(iphone)/.test(widow.navigator.userAgent);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,165评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,720评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,849评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,245评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,596评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,747评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,977评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,708评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,448评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,657评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,141评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,493评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,153评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,890评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,799评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,685评论 2 272

推荐阅读更多精彩内容

  • 题目1: 下面的代码输出多少?修改代码让 fnArr[i]() 输出 i。使用 两种以上的方法 var fnArr...
    saintkl阅读 308评论 0 0
  • 题目1: 下面的代码输出多少?修改代码让 fnArr[i]() 输出 i。使用 两种以上的方法 题目2: 封装一个...
    Taaaaaaaurus阅读 321评论 0 0
  • 题目1: 下面的代码输出多少?修改代码让 fnArr[i]() 输出 i。使用 两种以上的方法 题目2: 封装一个...
    peaceChierdo阅读 229评论 0 0
  • 题目1: 下面的代码输出多少?修改代码让 fnArri 输出 i。使用 两种以上的方法 题目2: 封装一个汽车对象...
    无目的阅读 171评论 0 0
  • BOM课件闭包概念1闭包概念2 1.下面的代码输出多少?修改代码让fnArr[i]() 输出 i。使用两种以上的方...
    饥人谷_米弥轮阅读 129评论 0 0