昨天在51上看到的

wtcsy 2010-02-11 04:53:24
http://perfectionkills.com/javascript-quiz/

做了一下 后来想了想 还是有几题还是想不通
另外 即使有的是想通了的 理解也未必就真的正确
所以 就写下来 各位前辈看看 在指教指教..........................
各位新年快乐 快乐







第一题

(function(){
return typeof arguments;
})();

函数里面的arguments引用的是Arguments对象

返回的自然是 object

第二题目

var f = function g(){ return 23; };
typeof g();

这题目应该有歧异 ff下不允许这么定义 答案自然是Error

如果是ie下 返回23 就是num了

至于firefox为什么不能这么定义 原因不明白

第三题

(function(x){
delete x;
return x;
})(1);

不明白

第四题

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

typeof返回的是字符串 x 为没有定义 typeof x返回'undefined'

x就是'undefined'

第五题

(function f(f){
return typeof f();
})(function(){ return 1; });

f是一个函数 f()===1

typeof 1 自然是"number"

第六题

var foo = {
bar: function() { return this.baz; },
baz: 1
};
(function(){
return typeof arguments[0]();
})(foo.bar);

执行一个匿名函数 参数是foo.bar

可以看成这样

(function(){
return typeof arguments[0]();
})( function() { return this.baz; });

执行时就成了 直接执行这个函数 this指向了window

所以是undefined

这题有点迷惑人 ,其实只要知道 在函数执行的时候有没有对象引用就行了,如果没有就指向window



var a = "B"
var c ={
a : "A",
c : function(){alert(this.a)}
}
var b =c.c;
c.c(); //A c对象调用的c方法
b(); //B b引用的c.c c.c只是一个函数 可以看承是 b= function(){alert(this.a)} 然后只是直接执行一个函数 所以指向了window

第七题

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

同第6题

第八题

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

逗号运算返回的是第最后一个

而这样写法本本身就是匿名函数的写法(fn)( ) Ps:如果里面的fn不是函数 会报告错误提示 fn不是函数

函数执行完了以后 f===2 typeof 2 自然是 'number'

第九题

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

不明白

第十题

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

未定义的变量typeof后 都返回"undefined"

x = ["undefined","undefined"][1] 即 x= "undefined" px : var a=[1,2][0]====> x=0

其实x已经是字符串了 typeof x 返回就是"string" 在来一typeof "string" 自然还是 "string"

第十一题

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

参数是{ foo: { bar: 1 } }

即函数里面的foo === { foo: { bar: 1 }}

可见 foo只有一个 foo的属性 所以 foo.bar是undefined

第十二题

(function f(){
function f(){ return 1; }
return f();
function f(){ return 2; }
})();

在函数里面有2个f函数

因为预编译的关系 后面的一个f覆盖了前面的一个f

所以 返回的是2 查查预编译做了什么就好理解了

第十三题

function f(){ return f; }
new f() instanceof f;

首先要知道new的过程即返回值

如果返回的是函数 new后还是返回的那个函数

如果是其他类型 , new后返回的是一个 obj

这里面的 f返回的是自己

自己又是由Function new出来的

所以是false

可以测试一下

function f(){ return f; }
alert(new f() instanceof Function); //true
function ff(){}
alert(new ff() instanceof ff )//true

第十四题

with (function(x, undefined){}) length;
函数的length属性只指参数的个数

with 语句 为一个或一组语句指定默认对象

后面的length 即是 function()function(x, undefined){}.length

可以测试一下 alert(function(x, undefined){}.length)
...全文
518 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
xin9755 2010-03-08
  • 打赏
  • 举报
回复
虽然不复杂。但考的都是基础知识点。呃
gmmgmm17 2010-02-22
  • 打赏
  • 举报
回复
看的有点眯糊。。。
谢谢LZ,学习了。。。
yan11cn 2010-02-21
  • 打赏
  • 举报
回复
好多牛人啊 js新手来学习了~
s_liangchao1s 2010-02-21
  • 打赏
  • 举报
回复
吃完饭了8-14

/*!
8. var f = (function f() { return "1"; }, function g() { return 2; })();
typeof f;
*/
答案: 'number'.
解析: 考察了逗号(,)作为运算符的作用.(返回最后一个表达式的运算值). 这里就是(function g(){})(); 返回的是2就是'number'.

/*!
9. var x = 1; if (function f(){}) { x += typeof f; } x;
*/
答案: '1undefined'(ECMAScript).
解析: 原理同2题. 就是在ECMAScript中.函数作为运算表达式的时候是无法通过其名字访问的. 所以x += typeof f为'1undefined'.

/*!
10. var x = [typeof x, typeof y][1]; typeof typeof x;
*/
答案: 'string'.
解析: 这个也很容易理解x = [,][1]; 即 x = typeof y = 'undefind'. 需要知道typeof 返回的是string类型就可以了 typeof typeof
必然就是'string'了.

/*!
11. (function (foo) { return typeof foo.bar; })({ foo: { bar: 1 } });
*/
答案: 'undefined'.
解析: 不知道这道题目的意义. 就是打马虎眼了. 传入的foo参数是个{ foo: { bar: 1 } }. 然后foo参数.bar当然没有了.

/*!
12. (function f() {
function f() { return 1; }
return f();
function f() { return 2; }
})();
*/
答案: 2.
解析: [纠正:桃子你强调预编译.我认为这个是一直以来的错误.js解析语言哪来的预编译过程?].这个就是规则.函数声明(区别var a = function函数表达式)
会将他的scope提前.词法分析的时候 后一个f将前一个f覆盖了. 所以运行期的时候返回的是2.

/*!
13. function f(){ return f; }
new f() instanceof f;
*/
答案: false.
解析: new 的时候 如果constructor返回的是object或者function 那么就会覆盖原来的constructor. 所以typeof new f() 返回的是'function' 显然不能
instanceof任何东西了.

/*!
14. with (function (x, undefined) {}) { length; }
*/
答案: 2.
解析: 函数的length得到的是函数实名参数的个数. 这里一个x一个undefined就是2个.
s_liangchao1s 2010-02-21
  • 打赏
  • 举报
回复
1-7

/*!
1. (function(){ return typeof arguments; })();
*/
答案: "object".
解析: 没啥说的arguments类数组对象.本身类型就是Object的.

/*!
2. var f = function g(){ return 23; }; typeof g();
*/
答案: Error(ECMAScript).
解析: function两种形式:[1]函数声明 [2]函数表达式(或函数运算).显然这里是函数表达式. 这段代码就是:
创建一个函数g并赋值给变量f. 这个函数g作为运算的时候可以当做匿名函数来对待.是不能通过名字访问到得(非ECMA例外).

/*!
3. (function (x) { delete x; return x; })(1);
*/
答案: 1.
解析: arguments不能delete.但不产生错误异常. 所以delete x返回false.即 x没有被删除. 所以return x 为 1.

/*!
4. var y = 1, x = y = typeof x; x;
*/
答案: 'undefined'.
解析: 没啥说的. = 运算顺序 由右至左. typeof x == 'undefined'.

/*!
5. (function f(f) { return typeof f(); })(function(){ return 1; });
*/
答案: 'number'.
解析: 我认为这道题考察点为当参数和函数重名时的优先级问题. 答案就是argument > function. 所以传入的函数return 1.
typeof 1为'number'.

/*!
6. var foo = { bar: function () { return this.baz; }, baz: 1 };
(function () { return typeof arguments[0](); })(foo.bar);
*/
答案: 'undefined'.
解析: 考察了this. this是运行时属性.取决于运行时的环境而非声明时的环境. 这里当执行arguments[0]()时this指向的当前
环境为argument. 所以argument.baz是undefined.

/*!
7. var foo = { bar: function(){ return this.baz; }, baz: 1 };
typeof (f = foo.bar)();
*/
答案: 'undefined'.
解析: 同6. f = foo.bar. 将其赋值给全局变量f.那么这时候的this就指向了window. window.baz也是undefined.
wtcsy 2010-02-21
  • 打赏
  • 举报
回复
引用 20 楼 s_liangchao1s 的回复:
.......................

新年好 给点可用分我吧 谢谢 嘿嘿 ...............................
s_liangchao1s 2010-02-21
  • 打赏
  • 举报
回复

过年了 上来看看桃子兄. 先接分后答题.
「已注销」 2010-02-21
  • 打赏
  • 举报
回复
基本不懂。。学习啊学习~~~~~~
wtcsy 2010-02-21
  • 打赏
  • 举报
回复
自己顶一下
引用 17 楼 freeflying1222 的回复:
.....................

应该是的
我测试了下 好象原生对象本身的属性和方法都不能删除掉(也不知道是不是)
(function(x){
alert(delete x); 删除成功返回true 删除不了返回false
return x;
})(1);
s_liangchao1s 2010-02-21
  • 打赏
  • 举报
回复

第二题. 考察的是FunctionDeclaration和FunctionExpression的区别.
详细参考ECMA文档第13章节Function Definition的 NOTE部分即可.

第五题. 我认为没啥可争的.很简单的问题.理解角度不同.但本质一样.

wtcsy 2010-02-21
  • 打赏
  • 举报
回复
第2个 你说我看的有点不明白 有没有专门的文档 我去瞧瞧

/*!
5. (function f(f) { return typeof f(); })(function(){ return 1; });
*/
答案: 'number'.
解析: 我认为这道题考察点为当参数和函数重名时的优先级问题. 答案就是argument > function. 所以传入的函数return 1.
typeof 1为'number'.


这个到是不大同意你的观点了 即使是重名 也应该是按作用域链的查找机智查找
这是执行一个f函数 会产生一个活动对象
活动对象会把参数f做为他的属性 然后查找的是时候是先查找的活动对象上的
执行的就是 function(){ return 1; }


9同第2题 给点资料

/*!
12. (function f() {
function f() { return 1; }
return f();
function f() { return 2; }
})();
*/
答案: 2.
解析: [纠正:桃子你强调预编译.我认为这个是一直以来的错误.js解析语言哪来的预编译过程?].这个就是规则.函数声明(区别var a = function函数表达式)
会将他的scope提前.词法分析的时候 后一个f将前一个f覆盖了. 所以运行期的时候返回的是2.

恩 我说的是不严谨 应该说是类似于预编译的...
但这么写也有一个好处 方便没看过些方便资料的同学当关键字查找........哈哈
ccssddnnsb 2010-02-21
  • 打赏
  • 举报
回复
up............
呼吸先生 2010-02-21
  • 打赏
  • 举报
回复
哈哈,接分!!!
哈哈,接分!!!
哈哈,接分!!!
CalvinDo 2010-02-21
  • 打赏
  • 举报
回复


SF
awperpvip 2010-02-21
  • 打赏
  • 举报
回复
xx
ws_hgo 2010-02-21
  • 打赏
  • 举报
回复
学习
......................
chate 2010-02-21
  • 打赏
  • 举报
回复
这是专业程序员的测试吧?
yixianggao 2010-02-21
  • 打赏
  • 举报
回复
有点儿意思
Even713 2010-02-21
  • 打赏
  • 举报
回复
学习下
回复内容太短了!
司机 2010-02-21
  • 打赏
  • 举报
回复
不错 不错 不错 不错 不错
加载更多回复(17)

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧