【转】外国朋友出的js题目,你能对几道 题目一 题目二 题目三 题目四 题目五 题目六 题目七 题目八 题目九 题目十 题目十一 题目十二 题目十三 题目十四

原文地址 http://perfectionkills.com/javascript-quiz/

中文地址加解释:by Aaron:http://www.cnblogs.com/aaronjs/p/3172112.html

附带了自己的理解,答案有争议的地方欢迎大家指出

2
3
4
(function(){
  return typeof arguments;
})();
 https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Operators/typeof

题目二

2
3
var f = function g(){ return 23; };
typeof g();
会发生错误
因为function g(){ return 23; }是函数表达式,事实上只有事一个名字,不是一个函数声明
函数实际上是绑定到变量f,不是g.
指定的标识符在函数表达式虽然有其用途:堆栈跟踪是清晰而不是充斥着无名的函数,你可以有一个匿名函数递归调用本身不使用argument.callee
附非常详细的帖子函数表达式
http://kangax.github.io/nfe/

题目三

2
3
4
5
(function(x){
  delete x;
  return x;
})(1);
 1
参数不可删除
见我发过的帖子(js中的delete定义)
http://www.cnblogs.com/aaronjs/articles/3148934.html
国外的帖子(理解删除)
http://perfectionkills.com/understanding-delete/

题目四

2
3
var y = 1, x = y = typeof x;
x;
 

题目五

2
3
4
(function f(f){
  return typeof f();
})(function(){ return 1; });
 为了便于理解我们继续分解:

第一部分
var baz = function(){ return 1; }; 

第二部分
(function f(f){ 
  return typeof f(); 
})(baz); 

在这里,函数f接受一个参数是另一个函数,f函数内部执行这个实参函数并且返回类型
无论是从调用该函数返回,即使参数名称f与函数名冲突,函数接受本身作为自己的参数,然后调用,此时就看谁更具有更高的优先级了,显然,参数的优先级更高,所以实际执行的是returntypeof 1

题目六

【转】外国朋友出的js题目,你能对几道
题目一
题目二
题目三
题目四
题目五
题目六
题目七
题目八
题目九
题目十
题目十一
题目十二
题目十三
题目十四
var foo = {  
  bar: function() { return this.baz; },  
  baz: 1 
}; 

(function(){  
  return typeof arguments[0](); 
})(foo.bar);
【转】外国朋友出的js题目,你能对几道
题目一
题目二
题目三
题目四
题目五
题目六
题目七
题目八
题目九
题目十
题目十一
题目十二
题目十三
题目十四

题目七

var foo = { 
  bar: function(){ return this.baz; }, 
  baz: 1 
} 
typeof (f = foo.bar)();

题目八

var f = (function f(){ return "1"; }, function g(){ return 2; })(); 
typeof f;

题目九

var x = 1; 
if (function f(){}) { 
  x += typeof f; 
} 
x;

题目十

(function f(){ 
  function f(){ return 1; } 
  return f(); 
  function f(){ return 2; } 
})();
 2
如果是一直看下来的话,这个题目应该是比较简单
简单的来说在执行return之前,函数声明会在任何表达式被解析和求值之前先被解析和求值,
即使你的声明在代码的最后一行,它也会在同作用域内第一个表达式之前被解析/求值,
参考如下例子,函数fn是在alert之后声明的,但是在alert执行的时候,fn已经有定义了

 alert(fn());

  function fn() {
    return 'Hello world!';
  }

所以题目中函数提升了两次,第二次把第一次覆盖了,
所以 return 后面的 f 是 return 语句的下一条语句声明的函数 f 。
注意自执行函数 (function f (){})(); 中的 f 并没有函数提升效果,它是表达式

题目十一

function f(){ return f; } 
new f() instanceof f;
 false
怎样去理解?
 new f()  
首先这个操作会创建一个新对象并调用构造函数函数这一新的对象作为它的当前上下文对象
简单的说 

new f();
依稀记得高级程序设计里面是这么说的:
1 创建空对象。
2 将类的prototype中的属性和方法复制到实例中。
3 将第一步创建的空对象做为类的参数调用类的构造函数
默认如果没有覆盖这个空对象的话,返回this

var a = new Object;
a instanceof Object    为 true


我们在看 f() 返回了 return f;

那么也就是说这个新的对象是是自身,构造函数本身在 new 的过程中会返回一个表示该对象的实例。
但是函数的返回值覆盖了这个实例,这个new 就形同虚设
果f的形式为 function f(){return this}或function f(){}就不一样
var a = new f();
a instanceof f  // false

值得注意的是 instanceof  检测的是原型

又附上我博客的 
JS 对象机制深剖——new 运算符 
http://www.cnblogs.com/aaronjs/archive/2012/07/04/2575570.html

题目十二

  var x = [typeof x, typeof y][1];
  typeof typeof x;

答案

这题目比较简单,注意下返回类型即可
x = [,][1];
即 x = typeof y = 'undefind'.
typeof 返回的是string类型就可以了 
typeof typeof必然就是'string'了.

题目十三

function(foo){ 
  return typeof foo.bar; 
})({ foo: { bar: 1 } });

题目十四

with (function(x, undefined){}) length;
 2
with用得很少,with 语句就是用于暂修改作用域链的或者通常用来缩短特定情形下必须写的代码量

使用with语句的JavaScript代码很难优化,因此它的运算速度比不使用with语句的等价代码要慢得多。

而且,在with语句中的函数定义和变量初始化可能会产生令人惊讶的、相抵触的行为,因此我们避免使用with语句

with的用法是这样的:
with(object) {},在大括号里面,可以引用object的属性而不用使用object.attr这种形式。
这道题里面,with接受了一个对象,只不过这个对象是函数,函数有length属性,
代表形参的个数,所以上面返回的值是2


mozilla with
http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Statements:with
推荐】来支持一下博主,谢谢!

如果是原创文章,转载请注明出处!!!

by Aaron:http://www.cnblogs.com/aaronjs/p/3172112.html