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面试典型常见问题与解答的更多相关文章

  1. document.body的一些用法以及js中的常见问题

    document.body的一些用法以及js中的常见问题 网页可见区域宽: document.body.clientWidth; 网页可见区域高: document.body.clientHeight ...

  2. 关于Installshield里一些常见问题的解答—艾泽拉斯之海洋女神出品

    原文:关于Installshield里一些常见问题的解答-艾泽拉斯之海洋女神出品 上一篇:一个完整的安装程序实例—艾泽拉斯之海洋女神出品(五) --补遗转载时请务必保留转载出处和由艾泽拉斯之海洋女神出 ...

  3. 【Keras学习】常见问题与解答

    Keras FAQ:常见问题 如何引用Keras? 如果Keras对你的研究有帮助的话,请在你的文章中引用Keras.这里是一个使用BibTex的例子 @misc{chollet2015keras, ...

  4. Handler的源码和常见问题的解答不崩溃

    Handler是Android中的消息处理机制,是一种线程间通信的解决方案,同时你也可以理解为它天然的为我们在主线程创建一个队列,队列中的消息顺序就是我们设置的延迟的时间,如果你想在Android中实 ...

  5. 前端js面试中的常见的算法问题

    虽说我们很多时候前端很少有机会接触到算法.大多都交互性的操作,然而从各大公司面试来看,算法依旧是考察的一方面.实际上学习数据结构与算法对于工程师去理解和分析问题都是有帮助的.如果将来当我们面对较为复杂 ...

  6. 【百度地图API】JS版本的常见问题

    1.请问如何将我的店铺标注在百度地图上?我是否可以做区域代理?在百度地图上标注是否免费? 答复: 这里只负责API的技术咨询,不解决任何地图标注问题.在百度地图上标注自己公司,即气泡标注业务.该业务已 ...

  7. js 面试的坑

    JavaScript事件属性event.target <!DOCTYPE html> <html> <head> <meta charset="UT ...

  8. Python高效编程技巧实战 实战编程+面试典型问题 中高阶程序员过渡

    下载链接:https://www.yinxiangit.com/603.html 目录:   如果你想用python从事多个领域的开发工作,且有一些python基础, 想进一步提高python应用能力 ...

  9. Vue + Js 面试宝典

    https://github.com/rohan-paul/Awesome-JavaScript-Interviewshttps://github.com/nieyafei/front-end-int ...

随机推荐

  1. PyCharm 设置Python 文件头部模板

    1. 菜单栏-> File -> Settings -> Editor -> File and Code Templates ->Python Script 2.配置头文 ...

  2. Zookeeper 四字命令 Four Letter Words

    1.zk可以通过它自身提供的简写命令来服务器进行交互 需要使用到nc命令,安装yum install nc echo  [commond] | nc [ip] [port] 2.[stat]  查看z ...

  3. golang 如何查看channel通道中未读数据的长度

    可以通过内建函数len查看channel中元素的个数. 内建函数len的定义如下: func len(v Type) int The len built-in function returns the ...

  4. ulimit设置内存限制是否有效

    如何使用ulimit限制物理内存 限制物理内存 $ ulimit -m 512000 经测试,无效. 限制物理内存不起作用,ulimit不支持限制物理内存,可见man ulimit手册 -m The ...

  5. VS未能正确加载包

    这个方法同样适用于多个版本的VS 首先关闭VS进这里:C:\Users\用户名\AppData\Roaming\Microsoft\VisualStudio\11.0(2012是11.0,根据你的VS ...

  6. webGL之three.js入门4--ThreeJS Editor入门篇

    因为工作需要,要看threejs editor的源码,顺便记录过程. github下载的源码目录是这样的 但是editor和其他文件夹内的内容的关联的,我需要将其独立出来并且编辑editor. 进入e ...

  7. vlan交换机的端口模式有哪几种

    一 端口类型1 ,Access用户模式2 ,Trunk链路模式3 ,Hybrid模式(跟Trunk很类似但比trunk高级)二 端口介绍2.1 ,Access类型端口:只允许默认vlan的以太网帧,也 ...

  8. SpringSecurity-SecurityContextPersistenceFilter的作用

    SecurityContextPersistenceFilter每个request只执行一次,以解决servlet容器的兼容性问题(特别是WebLogic). 它在request执行之前从Securi ...

  9. 【AMQ】之JMS概念

    1.JMS(Java Message Service)Java消息服务,是Java20几种技术其中之一 2.JMS规范定义了Java中访问消息中间件的接口,但是没有给实现,这个实现就是由第三方使用者来 ...

  10. 查AIX 版本和系统参数

    查AIX版本 atii:[/home/pmts]oslevel -s 7100-01-07-1316 即AIX 7.1版本atii:[/home/pmts]lsdev -C 查CPU个数 (逻辑数目) ...