博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
你自认为理解了JavaScript?
阅读量:6231 次
发布时间:2019-06-22

本文共 1460 字,大约阅读时间需要 4 分钟。

Email:longsu2010 at yeah dot net

CSDN论坛里有个帖子,“”,Dmitry Baranovskiy在自己的博客里出了五道测试题,测试一下大家是否真的懂JavaScript。

建议大家去原帖看看。

题目如下:

if (!("a" in window)) {    var a = 1;}alert(a);
var a = 1,    b = function a(x) {        x && a(--x);    };alert(a);
function a(x) {    return x * 2;}var a;alert(a);
function b(x, y, a) {    arguments[2] = 10;    alert(a);}b(1, 2, 3);
function a() {    alert(this);}a.call(null);

虽然回帖中已经有正确解释了,但是我还是回了帖子,而且还引用了上一个人的回帖,之所以引用,我觉得要有知其然知其所以然的精神,更何况“授人以鱼不如授人以渔”。我的回帖如下:

引用 257 楼 u011295110 的回复:
这几个问题都很棒,虽然不常见。其实都是在考对ecma-262是否了解,是否理解ecma-262原理。建议大家读一下emca-262标准。
官网为
中文版可以读
第一题:答案undefined
if (!("a" in window)) {
    var a = 1;
}
js函数正式执行前会先处理函数声明、形参、变量声明(创建变量但是不赋值,赋值在代码执行阶段)。本例先在代码执行前处理变量声明,也就是解析器先弄一个变量a,但是没到函数执行呢,还不能给他赋值。所以有了变量a,
注意是变量,全局变量相当于window的属性(其实不同,比如属性可以delete)所以"a" in window为true。
如果本题改为
if (!("a" in window)) {
    a = 1;
}
将不会优先处理变量声明,结果会不同。
作为对比可以改为如下,同样根据上面的说明作答,大家自己试试。
(function(){
if (!("a" in window)) {
var a = 1;
}
alert(a);
})();
第二题:答案1
var a = 1,
    b = function a (x) {
        x && a (--x);
    };
只要记住一点,命名函数表达式的名字仅在所定义的函数内有效,由ecmascript作用域链的构建规则决定。
第三题:答案 是一个函数
function a (x) {
    return x * 2;
}
var a;
按照第一题的解释中所说,先处理函数和声明和变量声明,所以a是一个函数,而var a不会改变赋值嘛,此后又没有赋值,所以a一直都是函数。
第四题:答案10
function b (x, y, a) {
     arguments[2] = 10;
     alert (a);
}
 b(1, 2, 3);
js每一个函数内都有一个隐含的arguments变量,是一个类数组结构,依次记录了参数的值,与参数同步更改。
第五题:答案window
function a () {
    alert (this);
}
a.call (null);
没啥可说的,默认用window。
忘说了,我觉得读ecmascript标准是学习最好的办法。

建议读英文,如果实在读不了读中文也会受益匪浅的。

 

转载地址:http://ngqna.baihongyu.com/

你可能感兴趣的文章
CMake 入门实战【转】
查看>>
软硬件之共生之道——一千零一夜的启发
查看>>
redis 性能建议
查看>>
Android MaoZhuaWeiBo开发Service抓取个人信息-2
查看>>
Codefoces 436 B. Om Nom and Spiders
查看>>
流程控制------if else分支语句
查看>>
禁用Clusterware在系统启动后自己主动启动
查看>>
Storm编程入门API系列之Storm的Topology默认Workers、默认executors和默认tasks数目
查看>>
Json转java对象和List集合
查看>>
PHP操作MongoDB数据库具体样例介绍(增、删、改、查) (六)
查看>>
关于Unity中的模型描边与Shader切换(专题二)
查看>>
《淘宝技术这十年》读后感
查看>>
程序员经常加班的真正原因
查看>>
windows系统下如何正确安装Cygwin(图文详解)
查看>>
SpringBoot接口服务处理Whitelabel Error Page
查看>>
mysql创建唯一索引
查看>>
Vijos1935不可思议的清晨题解
查看>>
Android Studio修改默认Activity继承AppCompatActivity
查看>>
Servlet和Android网络交互基础(3)
查看>>
javascript:void(0) 含义
查看>>