有趣的Js Quiz,测测你的Core Js内功

最近看国外同行的技术博客, 看到一篇有关"javascript小测试"的博文, 很有意思,
其中每个题目短小精悍, 却能很好的考察对 Core Javascript的掌握深度.如果你感兴趣,可以点击JavaScript
Quiz
查看原文, 为了做个记录, 我准备在下文罗列出这些题目, 并给出解释, 如果有解释不到位的地方, 欢迎园友指出.

首先有几个要注意的地方:

  • 以下题目采用ECMA3标准(不是5)

  • quirks模式的实现不予考虑

  • 每个代码片段的running context都是global

  • 除了代码中声明的变量, 没有其他的变量被声明

  • 答案根据表达式/语句(或最后一行)返回的值而定


// 第一题
(function() {
return typeof arguments;
})();
// "Object",好像没什么解释的,firebug下log下。

// 第二题
var f = function g() { return 23; };
typeof g();
// Runtime Error, 注意到第一行“=”右边是一个声明函数,如function funcName() {},
// “=”左边是var f即声明变量f,而整个语句对f进行了声明并初始化, 这种形式下funcName只能在函数体内做为函数本身的引用,
// 外部是无法访问的, 所以g是undefined, g()出错, 这里可以做下引申, 在ECMA5中arguments.callee已经deprecated,
// 所以我们能用以上特性来代替它, 如下面代码:
(function funcName() {
// ... some tasks here

// then, after 1s do more
// here we use funcName to replace arguments.callee which now is deprecated in ECMA5
setTimeout(funcName, 1000)
})();

// 第三题
(function(x) {
delete x;
return x;
})(1);
// 1, x在一个函数作用域中, 只是个变量, 这里delete x没什么实际意义, 关于delete操作也能引出 不少有趣的问题,
// 这里有篇博文详细阐述了delete操作, 点击understanding delete查看原文

// 第四题
var y = 1, x = y = typeof x;
x;
// "undefined", 主要是赋值语句从右向左执行, 首先y = typeof x, 此时x还未定义, 则y为"undefined", 再x = y, x初始化为"undefined"

// 第五题
(function() f(f) {
return typeof f();
})(function() { return 1; });
// "number", 如果函数名和参数名一样, 那么参数名的"优先级"更高, 覆盖同名函数名

// 第六题
var foo = {
bar: function() { return this.baz; },
baz: 1
};
(function() {
return typeof arguments[0]();
})(foo.bar);
// "undefined", 我们看到foo.bar做为参数传入, foo.bar是个函数, 实际上arguments[0]是个指向此函数的引用,
// 当通过 arguments[0]()执行此函数时, 其running context并不是foo, 所以函数中的this.baz为"undefined",
// 再深入分析, 你便会发现在runtime, this指向return typeof arguments[0]();中的arguments

// 第七题
var foo = {
bar: function(){ return this.baz; },
baz: 1
}
typeof (f = foo.bar)();
// "undefined", 解释如上一题, f是指向foo.bar函数的引用, 执行时不涉及foo, runtime时, this指向window

// 第八题
var f = (function f(){ return "1"; }, function g(){ return 2; })();
typeof f;
// "number", 此题主要是"逗号"表达式, 记住一点就行了: "逗号"表达式的值, 由其中最后一个表达式来定.
// 这样一来问题就很简单了, "逗号"表达式返回函数g, 执行函数g返回2, 便是"number"了.

// 第九题
var x = 1;
if (function f(){}) {
x += typeof f;
}
x;
// "1undefined", 主要是如何看待function f() {}, 这里这个函数声明被用作if的一个条件表达式, 而不是声明在global context下.
// 函数名f, 在函数外部依然无法访问, 所以typeof f为"undefined"

// 第十题
var x = [typeof x, typeof y][1];
typeof typeof x;
// "string", 可以简单的看成: var x = ["undefined", "undefined"][1]

// 第十一题
(function(foo){
return typeof foo.bar;
})({ foo: { bar: 1 } });
// Runtime Error, 看清楚传入的是{ foo: { bar: 1} }, 所以应该是foo.foo.bar, 这样代码才能正常通过

// 第十二题
(function f(){
function f(){ return 1; }
return f();
function f(){ return 2; }
})();
// 2, 记住一点:javascript引擎的在处理代码过程中,会预先把变量,函数的声明放到作用域头部,
// 所以以上代码等价如下代码:
(function f(){
function f(){ return 1; }
function f(){ return 2; } // override previous function declaration
return f();
})();

// 第十三题
function f(){ return f; }
new f() instanceof f;
// false, 虽然用了new操作符, 但是函数f会返回其本身的引用, 所以这里的new没起到作用

// 第十四题
with (function(x, undefined){}) length;
// 2, with表达式基本很少用, 或者根本不推荐使用, with用于绑定其块级代码的context,
// 这里length可以看做 this.length, 而this指向的就是函数function(x, undefined) {}, 很明显有2个形参

有趣的Js Quiz,测测你的Core Js内功

时间: 2024-10-07 16:08:46

有趣的Js Quiz,测测你的Core Js内功的相关文章

测测你的FQ(理财智商)

1.经常制定家庭财务计划,填制家庭资产负债表,了解自己的资产负债情况,分析每月现金流情况. 2.对自己每月的支出进行预算,一定额度以上的支出作好记录,并保存行用卡消费记录,计算每月的实际花费并检查与计划是否相符,若出现较大偏差及时分析其原因. 3.储备最少相当于六个月的生活费的现金,以备不时之需. 4.准备足够的保障金,若有不幸发生,家庭有足够的能力支付现有的开支和费用. 5.每做一项投资时,完全清楚投资项目的性质一以及风险大小. 6.投资于股票市场或外汇时,每项投资均这止于损价位,并且会严格准

什么程度的英语水平才叫好?进来测测你的等级

什么程度的英语水平才叫好?进来测测你的等级 什么程度的英语水平才叫好? LV1:与母语为英语的人能进行简单的沟通,互相明白意思LV2:你可以阅读并且撰写英文书信或者商业电邮LV3:你明白英文里的缩写,惯用语和俚语 (欢迎通过Urban Dictionary学习)LV4:你能明白英文笑话里面的梗(需要一些背景的文化知识)LV5: 你能很自如地通过一些日常问候来打开话题并进一步地继续与对方交谈LV6: 你可以阅读一部小说并且写一篇1000字的内容简介LV7: 使用英文思维LV8: 你可以说英文笑话,

测测你是男是女

[测测你是男是女, 据说很准]有些男人, 性格中有女人的特质; 有些女人, 性格中有男人的特质. 测试一下, 你是纯正的男人(或女人)吗? 凡是第一眼看下图是鸭子的, 就是男人特质多一点, 凡是第一眼看到是兔子的, 就是女人特质多一点. 很明显, 我一点都看不到兔子... 测测你是男是女

JS一般般的网页重构可以使用Node.js做些什么(转)

一.非计算机背景前端如何快速了解Node.js? 做前端的应该都听过Node.js,偏开发背景的童鞋应该都玩过. 对于一些没有计算机背景的,工作内容以静态页面呈现为主的前端,可能并未把玩过Node.js,且很有可能对Node.js都没有一个比较立体的认识——知道这玩意可以跑服务,构建很多前端工具,看上去很厉害的样子,但是,可能就仅限于此了. “那可否三言两语概括Node.js的林林总总呢?” “不可!” “那怎么办?” “那就六言四语!” 首先,要知道,Node.js一个JavaScript运行

jQuery 源码分析和使用心得 - core.js

core是jQuery的核心内容, 包含了最基础的方法, 比如我们常用的 $(selector, context), 用于遍历操作的 each, map, eq, first 识别变量类型的 isArray, isNumeric, type 等 . 这些方法为jQuery后续操作提供最基础的支持. 构造函数 jQuery( selector, context ) 说到jQuery, 大家可能最熟悉的就是 $(selector, context) , 我觉得这也是jQuery受到人们欢迎的很大一部

HTML5 画布上的 Three.js 环境灯光(HTML5 Canvas Three.js Ambient Lighting)

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. HTML5 画布上的 Three.js 环境灯光HTML5 Canvas Three.js Ambient Lighting <!DOCTY

JS中单引号/双引号以及外部js引入的一些问题

一.单引号和双引号的用法的问题 在JavaScript中可以使用单引号.双引号,二者也可以混合使用.但是,身为菜鸟的我,却碰到了一些引号的使用问题. <body> <div style="border:1px solid red; height:150px;width:150px;" onclick="alert("test");" id="test">This is a test. </div&

《Node.js入门》Windows 7下Node.js Web开发环境搭建笔记

近期想尝试一下在IBM Bluemix上使用Node.js创建Web应用程序.所以须要在本地搭建Node.js Web的开发測试环境. 这里讲的是Windows下的搭建方法,使用CentOS 的小伙伴请參考:<Node.js入门>CentOS 6.5下Node.js Web开发环境搭建笔记 Node.js是什么? 我们看看百科里怎么说的? JavaScript是一种执行在浏览器的脚本,它简单,轻巧.易于编辑,这样的脚本通经常使用于浏览器的前端编程.可是一位开发人员Ryan有一天发现这样的前端式

JS中的模块化开发之Sea.JS

模块化开发的好处: 1:减少冲突 2:提高性能 用sea.js为例:sea.js模块库下载地址:http://seajs.org/docs/#downloads 例子:获取非行间样式的模块化开发: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="