点击上方“
程序员大咖
”,选择“置顶公众号”
关键时刻,第一时间送达!
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
这道题有几个需要注意的地方:
-
变量声明、函数声明会被前置,但是函数表达式并不会,准确说类似变量声明前置,举个栗子:
console.log('b', b); var b = function() {}console.log('b', b);
2.具名的函数表达式的名字只能在该函数内部取到,举个例子(排除老的IE😂):
var foo = function bar () {}console.log('foo', foo); console.log('bar', bar);
综合这两点,再看题目,最后输出的内容就为 1
No.3
函数声明会覆盖变量声明,但不会覆盖变量赋值,举个栗子简单粗暴: