专栏名称: 程序员大咖
为程序员提供最优质的博文、最精彩的讨论、最实用的开发资源;提供最新最全的编程学习资料:PHP、Objective-C、Java、Swift、C/C++函数库、.NET Framework类库、J2SE API等等。并不定期奉送各种福利。
目录
相关文章推荐
51好读  ›  专栏  ›  程序员大咖

5道题看看你是否真的了解JS

程序员大咖  · 公众号  · 程序员  · 2017-07-29 19:31

正文

点击上方“ 程序员大咖 ”,选择“置顶公众号”

关键时刻,第一时间送达!


JavaScript是一门 奇怪 的语言,要真正掌握并不容易。废话不多说,来一个快速测试,5道题目,看看你对JavaScript是否真正掌握。准备好了吗?开始咯😄

题目

No.1

if (!("a" in window)) {    var a = 1;}console.log(a);

No.2

var a = 1,    b = function a(x) {        x && a(--x);    };console.log(a);

No.3

function a(x) {    return x * 2;}var a;console.log(a);

No.4

function b(x, y, a) {    arguments[2] = 10;    console.log(a);}b(1, 2, 3);

No.5

function a() {    console.log(this);}a.call(null);

解析

No.1

在浏览器环境中,全局变量都是 window 的一个属性,即
var a = 1 等价于 window.a = 1 in 操作符用来判断某个属性属于某个对象,可以是对象的直接属性,也可以是通过 prototype 继承的属性。
再看题目,在浏览器中,如果没有全局变量 a ,则声明一个全局变量 a (ES5没有块级作用域),并且赋值为1。很多人会认为打印的是1。非也,大家不要忘了变量声明会被前置!什么意思呢?题目也就等价于

var a;if (!("a" in window)) {    a = 1;}console.log(a);

所以其实已经声明了变量 a ,只不过 if 语句之前值是 undefined ,所以 if 语句压根不会执行。
最后答案就是 undefined

No.2

这道题有几个需要注意的地方:

  1. 变量声明、函数声明会被前置,但是函数表达式并不会,准确说类似变量声明前置,举个栗子:

console.log('b', b); // b undefinedvar b = function() {}console.log('b', b); // b function () {}

2.具名的函数表达式的名字只能在该函数内部取到,举个例子(排除老的IE😂):

var foo = function bar () {}console.log('foo', foo); // foo function bar(){}console.log('bar', bar);// Uncaught ReferenceError: bar is not defined

综合这两点,再看题目,最后输出的内容就为 1

No.3

函数声明会覆盖变量声明,但不会覆盖变量赋值,举个栗子简单粗暴:







请到「今天看啥」查看全文