5个JavaScript经典面试题


Posted in Javascript onOctober 13, 2014

1:Scope作用范围

 (function() {

    var a = b = 5;

 })();

 console.log(b);

什么会被打印在控制台上?

回答

上面的代码会打印 5。

这个问题的诀窍是,这里有两个变量声明,但 a 使用关键字var声明的。代表它是一个函数的局部变量。与此相反,b 变成了全局变量。

这个问题的另一个诀窍是,它没有使用严格模式 (‘use strict';)。如果启用了严格模式,代码就会引发ReferenceError的错误:B没有定义(b is not defined)。请记住,严格模式,则需要明确指定,才能实现全局变量声明。比如,你应该写:

 (function() {

    'use strict';

    var a = window.b = 5;

 })();
 console.log(b);

2:创建“原生”(native)方法

给字符串对象定义一个repeatify功能。当传入一个整数n时,它会返回重复n次字符串的结果。例如:

 console.log('hello'.repeatify(3));

应打印 hellohellohello。

回答

一个可能的实现如下所示:

 String.prototype.repeatify = String.prototype.repeatify || function(times) {

    var str = '';

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

       str += this;

    }

    return str;

 };

现在的问题测试开发者有关JavaScript继承和prototype的知识点。这也验证了开发者是否知道该如果扩展内置对象(尽管这不应该做的)。

这里的另一个要点是,你要知道如何不覆盖可能已经定义的功能。通过测试一下该功能定义之前并不存在:

 String.prototype.repeatify = String.prototype.repeatify || function(times) {/* code here */};

当你被要求做好JavaScript函数兼容时这种技术特别有用。

3:声明提升(Hoisting)

执行这段代码,输出什么结果。

 function test() {

    console.log(a);

    console.log(foo());

    var a = 1;

    function foo() {

       return 2;

    }

 }
10: test();

回答

这段代码的结果是 undefined 和 2。

原因是,变量和函数的声明都被提前了(移到了函数的顶部),但变量不分配任何值。因此,在打印变量的时候,它在函数中存在(它被声明了),但它仍然是undefined 。表示换句话说,上面的代码等同于以下内容:

 function test() {

    var a;

    function foo() {

       return 2;

    }
    console.log(a);

    console.log(foo());
    a = 1;

 }
 test();

4:this在JavaScript中如何工作的

下面的代码会输出什么结果?给出你的答案。

 var fullname = 'John Doe';

 var obj = {

    fullname: 'Colin Ihrig',

    prop: {

       fullname: 'Aurelio De Rosa',

       getFullname: function() {

          return this.fullname;

       }

    }

 };
 console.log(obj.prop.getFullname());
 var test = obj.prop.getFullname;
 console.log(test());

回答

答案是Aurelio De Rosa和John Doe。原因是,在一个函数中,this的行为,取决于JavaScript函数的调用方式和定义方式,而不仅仅是看它如何被定义的。

在第一个 console.log()调用中,getFullname()被调用作为obj.prop对象的函数。所以,上下文指的是后者,函数返回该对象的 fullname。与此相反,当getFullname()被分配到test变量时,上下文指的是全局对象(window)。这是因为test是被隐式设置为全局对象的属性。出于这个原因,该函数返回window的fullname,即定义在第一行的那个值。

5:call()和apply()

现在让你解决前一个问题,使最后的console.log() 打印 Aurelio De Rosa。

回答

该问题可以通过强制使用 call() 或者 apply()改变函数上下文。在下面我将使用call(),但在这种情况下,apply()会输出相同的结果:

console.log(test.call(obj.prop));
Javascript 相关文章推荐
jquery实现动态菜单的实例代码
Nov 28 Javascript
全面兼容的javascript时间格式化函数(比较实用)
May 14 Javascript
深入分析JSONP跨域的原理
Dec 10 Javascript
使用jQuery管理选择结果
Jan 20 Javascript
Jquery对select的增、删、改、查操作
Feb 06 Javascript
浅析jQuery Mobile的初始化事件
Dec 03 Javascript
Bootstrap Modal遮罩弹出层(完整版)
Nov 21 Javascript
防止重复发送 Ajax 请求
Feb 15 Javascript
Angular实现点击按钮控制隐藏和显示功能示例
Dec 29 Javascript
小程序实现带年月选取效果的日历
Jun 27 Javascript
vue中实现点击变成全屏的多种方法
Sep 27 Javascript
JavaScript ES 模块的使用
Nov 12 Javascript
Json实现异步请求提交评论无需跳转其他页面
Oct 11 #Javascript
innerHTML动态添加html代码和脚本兼容多个浏览器
Oct 11 #Javascript
ie8模式下click无反应点击option无反应的解决方法
Oct 11 #Javascript
JS 获取鼠标左右键的键值方法
Oct 11 #Javascript
jquery动态加载js/css文件方法(自写小函数)
Oct 11 #Javascript
打造个性化的功能强大的Jquery虚拟键盘(VirtualKeyboard)
Oct 11 #Javascript
JavaScript中实现最高效的数组乱序方法
Oct 11 #Javascript
You might like
php 验证码制作(网树注释思想)
2009/07/20 PHP
php数组函数序列之next() - 移动数组内部指针到下一个元素的位置,并返回该元素值
2011/10/31 PHP
preg_match_all使用心得分享
2014/01/31 PHP
php中动态修改ini配置
2014/10/14 PHP
PHP文件操作详解
2016/12/30 PHP
php+mysql开发中的经验与常识小结
2019/03/25 PHP
PHP 结合 Boostrap 结合 js 实现学生列表删除编辑及搜索功能
2019/05/21 PHP
JQuery 常用方法基础教程
2009/02/06 Javascript
Jquery中增加参数与Json转换代码
2009/11/20 Javascript
网站如何做到完全不需要jQuery也可以满足简单需求
2013/06/27 Javascript
js实现动态添加、删除行、onkeyup表格求和示例
2013/08/18 Javascript
Select标签下拉列表二级联动级联实例代码
2014/02/07 Javascript
原生JS实现N级菜单的代码
2017/05/21 Javascript
vue.js加载新的内容(实例代码)
2017/06/01 Javascript
基于VUE移动音乐WEBAPP跨域请求失败的解决方法
2018/01/16 Javascript
vue-cli history模式实现tomcat部署报404的解决方式
2019/09/06 Javascript
Node.JS用纯JavaScript生成图片或滑块式验证码功能
2019/09/12 Javascript
使用python提取html文件中的特定数据的实现代码
2013/03/24 Python
python opencv minAreaRect 生成最小外接矩形的方法
2019/07/01 Python
python中sort sorted reverse reversed函数的区别说明
2020/05/11 Python
使用已经得到的keras模型识别自己手写的数字方式
2020/06/29 Python
Python 实现一个计时器
2020/07/28 Python
通俗讲解python 装饰器
2020/09/07 Python
如何基于pandas读取csv后合并两个股票
2020/09/25 Python
商超业务员岗位职责
2014/03/12 职场文书
大学新闻系应届生求职信
2014/06/02 职场文书
拓展策划方案
2014/06/03 职场文书
个人查摆剖析材料
2014/10/04 职场文书
查摆问题整改措施范文
2014/10/11 职场文书
2015年科室工作总结
2015/04/10 职场文书
民事答辩状范本
2015/05/21 职场文书
和领导吃饭祝酒词
2015/08/11 职场文书
导游词幽默开场白
2019/06/26 职场文书
假期读书倡议书3篇
2019/08/19 职场文书
Java日常练习题,每天进步一点点(38)
2021/07/26 Java/Android
VUE中的v-if与v-show区别介绍
2022/03/13 Vue.js