今天看文档发现一个有点意思的题目:
1 | (function(x){ |
最开始我以为答案是undefined,但文档上的答案令我百思不得其解:“函数参数无法 delete 删除, delete 只能删除通过 for in 访问的属性。删除失败也不会报错,所以代码运行会弹出 1”。delete不能删除那么答案也应该是 6 呀,然后我测试了一下果然是6 = =
这种题目平常可能很难用上,不过考验一下基础概念应该还是很有趣的。于是我又找了一些类似的题目瞅瞅:
1
1 | (function(){ |
答案:’object’
解释:考验对typeof和arguments的理解。arguments 是对象,并且typeof [1,2] == ‘object’
2
1 | var f = function g(){ return 23; }; |
答案:js报错
解释:考验函数的声明方法。因为函数g未定义。在 JS 里,声明函数只有 2 种方法:
第 1 种: function foo(){…} (函数声明)
第 2 种: var foo = function(){…} (等号后面必须是匿名函数,这句实质是函数表达式)
此处g是函数名,然而第一行不是一个函数声明,因此函数名g仅能在该函数内部被访问到,外部访问不到。
3
1 | var y = 1, x = y = typeof x; |
答案:undefined
解释:考验赋值运算。先将 typeof x 赋值给 y ,此时 x 未定义,故为 “undefined”,最后将 y 的值赋给 x
4
1 | (function f(f){ |
这道题让我逻辑混乱了都= =
答案:number
解释:在函数里的 f() 其实是参数的那个 f 的执行结果,所以是 typeof 1,也就是 “number”,相当于:
1 | (function f(){ |
5
1 | var foo = { |
答案:undefined
解释:考验this的指向。这里的 this 指的是 arguments
6
1 | var foo = { |
这道题没弄懂感觉和上一道有点类似= =
答案:undefined
解释:考验this。因为CallExpression是不带有上下文信息,this会指向global;当你以foo.bar() 调用时,被调用的function是「MemberExpression」,而如果进行了f=foo.bar()赋值之后,那么function就会变成「CallExpression」了,因此this绑定就失效了。
7
1 | var f = (function f(){ return "1"; }, function g(){ return 2; })(); |
答案:number
解释:f=2。只有最后面的函数会被执行。逗号除了作为分隔符,也是一个操作符,总是返回最后一项。例如:var num = (1,2,3,4) // num=4
8
1 | var x = 1; |
答案:1undefined
解释:括号内的 function f(){} 不是函数声明,会被转换成 true (只有””(空字符串)、0、NaN、null、undefined的布尔值是false),因此 f 未定义。如何判断是否是函数声明:function这个关键词之前有任何东西,那么这都不是一个函数声明,而是函数表达式。
9
1 | var x = [typeof x, typeof y][1]; |
答案:string
解释:第一行执行完后 x === “undefined” ,所以连续求 2 次 typeof 还是 “string”
10
1 | (function f(){ |
答案:2
解释:由于声明提升,后面的 f() 会覆盖前面的 f()。function声明和var声明不同,var声明对于重复的声明是忽略的,而function声明则是覆盖。
11
1 | with (function(x, undefined){}) length; |
答案:2
解释:with 限定了作用域是这个函数,function.length 返回函数的参数个数,所以是 2。
undefined 虽然是关键词,但可以被覆写。但 null 不能。


