JavaScript面试题(三)

一、以下代码的输出结果是多少?

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

        setTimeout(function(){
        console.log(i);
        },1000);
    
    }

结果是:55555
追问:怎样变成01234?

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

二、this指向问题

1、在全局作用域内,this指向window
2、函数内部的this指向函数执行时的直接调用者
3、构造函数中的this指向new关键字创建的实例对象
4、严格模式下没有直接调用者的函数中的this指向undefined
5、用call,apply,bind间接调用函数后,this指向被绑定的对象

补充:
箭头函数中的this指向定义时this所处的宿主对象,而不是执行时调用它的对象

参考文献:
彻底理解js中this的指向,不必硬背。
深入理解ES6箭头函数的this以及各类this面试题总结

三、实现一个倒计时函数,类似于秒杀。

    window.onload=function(){

        var time=Date.UTC(2017,9,10,23-8,0,0);//设定一个倒计时时间点(毫秒)
        var counter=setInterval(function (){
            var temp=Date.now();//获取当前时间(毫秒数)
            if(temp<=time){//如果没有到达倒计时时间点
               console.log(Math.floor((time-temp)/1000));//显示剩余时间
            }else{
                clearInterval(counter);//到达倒计时时间点,清除定时器
            }

        },1000);
    };

分析:
Date.UTC(年,月-1,日,时,分,秒),返回的是当前时区的毫秒数。
Date.now()返回的是GMT时间,即格林威治时间的毫秒数。

四、解释变量作用域

1、变量的作用域 :全局作用域和函数作用域。
2、函数内部可以直接读取全局变量,但是在函数外部无法读取函数内部的变量。

五、模仿块级作用域(自执行函数)

JavaScript中没有块级作用域的概念,但是有函数作用域。因此可以用函数作用域模仿块级作用域
1、方法:定义一个匿名函数(function(){})并立即调用((匿名函数)())。

(function(){
//这里是块级作用域
})();

这样,在匿名函数中定义的任何变量都会在匿名函数执行结束时被销毁。
2、作用创建私有作用域,从而限制向全局作用域中添加过多的变量和函数防止命名冲突

五、闭包

1、定义:能够读取其他函数内部变量的函数。
2、用途 :

①模仿块级作用域(创建并立即调用一个函数)。
②设置访问函数中私有变量的和私有函数的特权方法。
③模块模式:为单例创建私有变量和特权方法。

3、缺点:

①闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成性能问题。
解决方法:在退出函数之前,将不使用的局部变量全部删除
②闭包能够在父函数外面,改变父函数内部变量的值。所以,如果你把父级函数当做对象使用,把闭包当做它的公用方法,把内部变量当作它的私有属性,这时候要注意不要随便改动父函数内部变量的值。

4、如何释放掉闭包中的局部变量?

个人猜想:
父函数返回值为子函数,并将子函数赋给一个变量test。释放掉闭包中的局部变量,就可以将test重新赋值为null。使得没有变量引用父函数的返回的子函数即可。
参考文献:
什么是闭包?闭包的优缺点?
[JavaScript高级程序设计]

六、垃圾收集

一)JavaScript自动垃圾收集机制的原理:

找出那些不再继续使用的变量,然后释放其占用的内存。为此,垃圾收集器会按照固定的时间间隔(或代码执行中预定的手机时间)周期性地执行这一操作。

二)标识无用变量的策略:
1、标记清除

①当变量进入环境时,将变量标记为“进入环境”永远不能释放进入环境的变量所占用的内存
②当变量离开环境时,将其标记为“离开环境”。垃圾收集器会销毁那些带有标记的值,并回收它们所占用的内存空间

2、引用计数(不常用)

原理:跟踪记录每个值被引用的次数。
①将一个值赋给一个声明的变量,这个值的引用次数是1。
②将同一个值赋给另一个变量,则该值的引用次数+1。
③包含这个值引用的变量取得了另外一个值,则该值引用次数-1。
④当这个值的引用次数变为0时,则说明没有办法在访问这个值了,因而可以将其占用的内存空间回收。

--存在问题:循环引用
定义:对象A中包含一个指向对象B的指针。对象B中也包含一个指向对象A的指针。
例如:

function problem(){
var objectA=new Object();
var objectB=new Object();
objectA.someOtherObject=objectB;
objectB.anotherObject=objectA;
}

在这个例子中,objectA和ObjectB通过各自属性相互引用,引用次数都是2。函数执行完毕后,objectA和ObjectB的引用次数不为0,还将继续存在。假设这个函数被重复多次调用,就会导致大量内存的不到回收。

七、Eventloop

在程序中设置两个线程,一个负责程序本身的运行,称为“主线程”;另一个负责主线程与其他进程(主要是I/O操作)的通信,被称为“Event Loop线程”。
每当遇到I/O的时候,主线程就让Event Loop线程去通知相应的I/O程序,然后接着往后运行,不会被当前I/O阻塞。等到I/O程序完成操作,Event Loop线程再把结果返回主线程。主线程就调用事先设定的回调函数,完成整个任务。这种运行方式叫做“异步模式”或“非阻塞模式”。

补充:单线程模式使得JavaScript更简单,占用资源更少。
参考文献:
什么是 Event Loop?

八、函数声明和函数表达式

1、函数声明:

function sum(num1,num2){
        return num1+num2;
}

解析器在向执行环境中加载数据时,会率先读取函数声明,并使其在执行任何代码前可用(函数声明提升)。
例1:

console.log(sum(10,10));
function sum(num1,num2){
        return num1+num2;
}

上例中,可以在sum的函数声明之前调用该函数。
2、函数表达式:

var  sum=function(num1,num2){
        return num1+num2;
};

对于函数表达式 ,必须等到解析器执行到它所在的代码行,才会真正被解释执行。

console.log(sum(10,10));
var sum=function(num1,num2){
        return num1+num2;
};

上例中,代码会报错。因为函数位于一个初始化语句中,而不是一个函数声明。换句话说,在执行到函数所在的语句之前,变量sum中不会保存对函数的引用,而且因为第一行代码就会导致“unexpected identifier”意外标识符错误,实际上也不会执行到下一行。

九、标签的位置

建议把全部JavaScript引用放在<body>元素中页面内容的后面,这样在解析JavaScript代码之前,页面的内容将完全呈现在浏览器中。用户也会因为浏览器窗口显示空白页面的时间缩短而感到打开页面的速度加快了。
如下例所示:
···
<!DOCTYPE html>
<html>
<head>
<title>Example HTML Page</title>
</head>
<body>

<script type="text/javascript" src="example1.js"></script>
<script type="text/javascript" src="example2.js"></script>
</body>
</html>
···
参考文献:
JavaScript高级程序设计

十、延迟脚本和异步脚本

1、延迟脚本:

HTML4.01中引入defer属性。(低版本IE支持)
作用:告诉浏览器立即下载脚本,但使脚本延迟到整个页面都解析完成后再运行。

<!DOCTYPE html>
<html>
<head>
<title>Example HTML Page</title>
</head>
<body>
<!--这里显示内容-->
<script type="text/javascript"  defer="defer" src="example1.js"></script>
<script type="text/javascript"  defer="defer" src="example2.js"></script>
</body>
</html>

注意:HTML5规范要求多个延迟脚本按顺序执行,但实际情况中延迟脚本不一定按照顺序执行。

2、异步脚本

HTML5中引入async属性。(低版本IE不支持)
作用:告诉浏览器立即下载脚本,但不用等待脚本的下载和执行,可以异步加载页面中的其他内容。

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

推荐阅读更多精彩内容

  • 《ijs》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 10...
    叶染柒丶阅读 5,026评论 0 7
  • 个人学习批处理的初衷来源于实际工作;在某个迭代版本有个BS(安卓手游模拟器)大需求,从而在测试过程中就重复涉及到...
    Luckykailiu阅读 4,669评论 0 11
  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 2,046评论 1 10
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,709评论 2 17
  • 女人之间的话题,似乎永远都离不开两个词:男人和金钱。 聊及男人,自然要谈情感生活,谁失恋了、谁结婚了、谁又恋爱了。...
    遇见独舞阅读 5,221评论 40 122