JS面试典型常见问题与解答
Q1:下面代码段的输出是什么? 为什么? (Scope)
(function() {
var a = b = 5;
})();
console.log(b);
A1: 输出是5.
在上面的立即调用函数表达式(IIFE----Immediately Invoked Function Expression)中,
变量a是用var定义的局部变量, 变量b没有定义, 所以系统就自动定义它为全局变量。
所以,变量b的值会一直保存, 并被IIFE之后的log语句使用
追问:在严格模式(use strict),上面的代码会导致Uncaught ReferenceError. 为什么? 如何改。
A: 因为 在strict 模式下必须显式地引用全局变量,把b写成window.b
修改后如下:
(function() {
'use strict';
var a = window.b = 5;
})();
console.log(b);
Q 2: 为String对象添加1个函数repeatify(n), n是整数,n>0,函数返回一个字符串,重复n遍本字串的内容。例如:
console.log('hello'.repeatify(3));
返回 hellohellohello.
A2:
String.prototype.repeatify = String.prototype.repeatify || function(times) {
var str = '';
for (var i = 0; i < times; i++) {
str += this;
}
return str;
};
答案要点:
- 继承和prototype.
- 拓展内置的元素类别.
- 这是好习惯:总是尽量避免覆盖已有函数, 通过如下形式的测试:
String.prototype.repeatify = String.prototype.repeatify || function(times) {/* code here */};
Q 3:变量和函数的声明自动提前(hoisting)
下面代码段的执行结果是什么? 为什么?
function test() {
console.log(a);
console.log(foo());
var a = 1;
function foo() {
return 2;
}
}
test();
A:执行结果如下:
undefined
2
变量和函数的声明都会提前到函数的顶部,但是,变量的赋值不提前,所以,log(a)的时候,这个变量a是声明了,但是没有赋值, 是 undefined.
function test() {
var a; // 变量的声明被提前到函数的顶部,
function foo() { //函数的声明被提前到函数的顶部,
return 2;
}
console.log(a);
console.log(foo());
a = 1; // 变量的赋值, 不会被提前,留在了原地
}
test();
Q4:下面代码段的执行结果是什么? 为什么?(this的含义)
var fullname = '张三';
var obj = {
fullname: '李四',
prop: {
fullname: '王五',
getFullname: function() {
return this.fullname;
}
}
};
console.log(obj.prop.getFullname());
var test = obj.prop.getFullname;
console.log(test());
A:执行结果是:
王五
张三
原因是this所指的内容, 取决于函数调用时的上下文,而不是定义时的内容。
在通过obj.prop.getFullname()调用的时候, 函数getFullnanme()是当作obj.prop对象的一个函数, 所以它的上下文是prop对象,函数里面的this就指向obj.prop对象,所以, this.getFullname()就是obj.prop的局部变量,王五;
在通过test()调用的时候, getFullname 被赋值给了变量 test,test是全局对象windows的属性,所以, this也就指向了windows,
Question 5: call() and apply()
Q5: 修改Q4中的最后一行代码, 使得输出为“王五” (区别call()和apply())
A5:
console.log(test.call(obj.prop));
test.call(obj.prop)把上下文obj.prop传给函数test,从而使得函数test中的this指向obj.prop.
也可以用apply,写成
console.log(test.apply(obj.prop));
区别在于apply以数组的形式提供其余参数,call以单列形式提供其余参数。例如:
函数func(v1, v2, v3), 用call和apply分别调用如下:
func1.apply(obj.prop, [v1, v2, v3]);
func1.call(obj.prop, v1, v2, v3);
JS面试典型常见问题与解答的更多相关文章
- document.body的一些用法以及js中的常见问题
document.body的一些用法以及js中的常见问题 网页可见区域宽: document.body.clientWidth; 网页可见区域高: document.body.clientHeight ...
- 关于Installshield里一些常见问题的解答—艾泽拉斯之海洋女神出品
原文:关于Installshield里一些常见问题的解答-艾泽拉斯之海洋女神出品 上一篇:一个完整的安装程序实例—艾泽拉斯之海洋女神出品(五) --补遗转载时请务必保留转载出处和由艾泽拉斯之海洋女神出 ...
- 【Keras学习】常见问题与解答
Keras FAQ:常见问题 如何引用Keras? 如果Keras对你的研究有帮助的话,请在你的文章中引用Keras.这里是一个使用BibTex的例子 @misc{chollet2015keras, ...
- Handler的源码和常见问题的解答不崩溃
Handler是Android中的消息处理机制,是一种线程间通信的解决方案,同时你也可以理解为它天然的为我们在主线程创建一个队列,队列中的消息顺序就是我们设置的延迟的时间,如果你想在Android中实 ...
- 前端js面试中的常见的算法问题
虽说我们很多时候前端很少有机会接触到算法.大多都交互性的操作,然而从各大公司面试来看,算法依旧是考察的一方面.实际上学习数据结构与算法对于工程师去理解和分析问题都是有帮助的.如果将来当我们面对较为复杂 ...
- 【百度地图API】JS版本的常见问题
1.请问如何将我的店铺标注在百度地图上?我是否可以做区域代理?在百度地图上标注是否免费? 答复: 这里只负责API的技术咨询,不解决任何地图标注问题.在百度地图上标注自己公司,即气泡标注业务.该业务已 ...
- js 面试的坑
JavaScript事件属性event.target <!DOCTYPE html> <html> <head> <meta charset="UT ...
- Python高效编程技巧实战 实战编程+面试典型问题 中高阶程序员过渡
下载链接:https://www.yinxiangit.com/603.html 目录: 如果你想用python从事多个领域的开发工作,且有一些python基础, 想进一步提高python应用能力 ...
- Vue + Js 面试宝典
https://github.com/rohan-paul/Awesome-JavaScript-Interviewshttps://github.com/nieyafei/front-end-int ...
随机推荐
- 图的最短路径——dijkstra算法和Floyd算法
dijkstra算法 求某一顶点到其它各个顶点的最短路径:已知某一顶点v0,求它顶点到其它顶点的最短路径,该算法按照最短路径递增的顺序产生一点到其余各顶点的所有最短路径. 对于图G={V,{E}};将 ...
- 利用 groupby apply list 分组合并字符
利用 groupby apply list 分组合并字符 因为需要对数据进行分组和合并字符,找到了以下方法. 有点类似 SQL 的 Group BY. import pandas as pd impo ...
- day 3 大纲笔记
01 昨日内容回顾 while 条件: 循环体 如何终止循环: 1,改变条件. 2,break. 3,exit() quit() 不推荐. 关键字: break continue while else ...
- Web 单点登录(SSO) 实现模型
有网友问起, 前后端分离 架构下的 Web 单点验证 怎么做, 我画了个图 : Temp Token 就 相当于 短信验证码 . Web 单点登录 都可以用这个 模型, 不仅仅是 前后端分离 .
- 漫谈 C++ 虚函数 的 实现原理
文中讲述的原理是推理和探讨 , 和现实中的实现不一定完全相同 . C++ 的 虚函数 , 编译器 会 生成一个 虚函数表 . 虚函数表, 实际上是 编译器 在 内存 中 划定 的 一块 区域, 用于存 ...
- idea+maven+springmvc+helloworld
1.添加依赖,并在项目上添加Spring mvc框架的支持(add FrameWork Support): <dependency> <groupId>junit</gr ...
- 自然语言处理工具hanlp关键词提取图解TextRank算法
看一个博主(亚当-adam)的关于hanlp关键词提取算法TextRank的文章,还是非常好的一篇实操经验分享,分享一下给各位需要的朋友一起学习一下! TextRank是在Google的PageRan ...
- HADOOP1.X中HDFS工作原理
转载自:http://www.daniubiji.cn/archives/596 HDFS(Hadoop Distributed File System )Hadoop分布式文件系统.是根据googl ...
- 【java】注释
一.注释 1. 注释类型 [a]. 单行注释 // 单行注释 [b]. 多行注释 /* 多行注释 */ [c]. 文档注释 /** 文档注释 */ 一般情况下,需求,实现方式用多行注释,类和方法上 ...
- 阅读<<SDI TX Bridge>>笔记
阅读<<SDI TX Bridge>>笔记 1.Path from AXI4-Stream Video Processing to SDI 2.Top Level Block ...