当前位置: 首页 > news >正文

你自认为理解了JavaScript?

Email:longsu2010 at yeah dot net

CSDN论坛里有个帖子,“你自认为理解了JavaScript?”,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标准。
官网为 http://www.ecma-international.org/publications/standards/Ecma-262.htm
中文版可以读 http://www.mojijs.com/2013/07/119399/index.html


第一题:答案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标准是学习最好的办法。
建议读英文,如果实在读不了读中文也会受益匪浅的。

 

相关文章:

  • 【转】Deep Learning(深度学习)学习笔记整理系列之(二)
  • 引用与指针的区别
  • 劣质代码评析——《写给大家看的C语言书(第2版)》附录B之21点程序(三)
  • Android 百度地图定位(手动+自动)
  • Swing的Look And Feel机制研究
  • html Ie 6,7,8 a超链带灰底
  • iMatrix平台核心功能——工作流管理介绍
  • 缓存、缓存算法和缓存框架简介
  • 【学习笔记10】Linux常用命令7 - 网络通信、系统关机
  • SetFileAttributes
  • “与客户的一次沟通”的所思、所虑、所得
  • Delphi Listveiw用法大全
  • apache日志存放位置(转)
  • Centos和RHEL的区别
  • Cacti监控tomcat的方法
  • 2017-09-12 前端日报
  • CAP 一致性协议及应用解析
  • Fundebug计费标准解释:事件数是如何定义的?
  • iOS | NSProxy
  • leetcode讲解--894. All Possible Full Binary Trees
  • niucms就是以城市为分割单位,在上面 小区/乡村/同城论坛+58+团购
  • 关于for循环的简单归纳
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 原生 js 实现移动端 Touch 滑动反弹
  • mysql面试题分组并合并列
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​软考-高级-系统架构设计师教程(清华第2版)【第9章 软件可靠性基础知识(P320~344)-思维导图】​
  • #includecmath
  • (10)STL算法之搜索(二) 二分查找
  • (a /b)*c的值
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (附源码)ssm高校实验室 毕业设计 800008
  • (一)80c52学习之旅-起始篇
  • (一)UDP基本编程步骤
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .net2005怎么读string形的xml,不是xml文件。
  • .NET开发不可不知、不可不用的辅助类(一)
  • .NET企业级应用架构设计系列之开场白
  • //解决validator验证插件多个name相同只验证第一的问题
  • [<事务专题>]
  • [2024] 十大免费电脑数据恢复软件——轻松恢复电脑上已删除文件
  • [ai笔记4] 将AI工具场景化,应用于生活和工作
  • [Android Studio 权威教程]断点调试和高级调试
  • [Angular 基础] - 指令(directives)
  • [Angular] 笔记 7:模块
  • [ARC066F]Contest with Drinks Hard
  • [BJDCTF 2020]easy_md5
  • [BSGS算法]纯水斐波那契数列
  • [C++基础]-入门知识
  • [Flexbox] Using order to rearrange flexbox children