今天在看PPTV几道题目,顺便联系起红宝书《JavaScript高级程序设计》一起看了起来。

1.

var msg = 'hello';//顶级作用域windwo下有个变量msg
function great(name, attr) {
var name = 'david';
var greating = msg + name + '!';
var msg = '你好';
for (var i = 0; i < 10; i++) {
var next = msg + '你的id是' + i * 2 + i;
}
alert(arguments[0]);
alert(arguments[1]);
alert(greating);
alert(next);
}
great('Tom')

解析:

函数great有2个实参,一个是name,一个是atr,顶级作用域window下有个变量msg,而函数great内部也有变量msg,函数great运行的时候传入的参数是tom,而且是一个参数,即是实参name的传参,alert(arguments[0]);arguments即是函数实参的类数组,所以arguments[0]自然是name,而因为函数有个参数name,又因为,所以alert(arguments[0])即是david。
alert(arguments[1]);因为没有第二个参数所有是undefined
。alert(greating),关于这个的结果,就要考虑到了预编译及其变量查找,因为函数内部已经有了msg又因为变量查找的时候先在自己的作用域内部查找如果没有找到再从外面作用域一层一层向外查找,这里函数内部已经有定义变量var msg='你好',所以已经在自己的作用域下找到msg,又因为变量运行的时候要对var定义的变量进行预编译并且把变量赋值成undefined,所以函数运行的时候msg只是undefined,当运行到了var msg='你好';之后msg才是你好,而name是david所以结果是undefineddavid!
字符串连接,接着alert(next);因为,这里是个循环,每次都进行了一个创建和摧毁的机制,循环完成的时候i应该是等于9,即var next=msg+'的你的id是'+i*2+i ;等于var next=你好+'你的id是'+i*9+9 ;这里也是字符串连接,所以是你好你的id是189。
 

P64----理解参数

ECMAscript中的参数在内部是通过一个数组来表示的,在函数体内可以通过arguments对象来访问这个数组,从而获取传递给函数的每一个参数。这里arguments[0]就是name,而arguments[1]没有定义,所以为undefined。

P73---执行环境及作用域:

全局变量和函数都是作为windows对象的属性和方法创建的,某个执行环境中的所有代码执行完毕后,该环境被销毁,保存在其中的所有变量和函数定义也会随之销毁。每个函数都有自己的执行环境,当执行流进入一个函数时,函数的环境会被推入一个环境栈中,而在函数执行完后,栈将被环境弹出,把控制权返回给之前的执行环境。当代码在一个环境中执行时,会创建变量对象的一个作用域链,来保证对执行环境有权访问的所有变量和函数的有序访问。作用域的前端,始终都是当前执行的代码所在环境的变量对象。标识符解析是沿着作用域链一级一级地搜索标识符的过程。搜索过程始终从作用域链的前端开始,然后逐级向后回溯,直至找到标识符为止。

2.  

var t=true;
window.setTimeout(function(){
t=false;
},1000);
while(t){ }
alert('end');

考察线程。JS只有一个代码线程,setTimeout是异步,。所以一但这个线程不结束,所有的其它线程(比如计时器setTimeout)都不能执行。JavaScript引擎是单线程运行的,浏览器无论在什么时候都只且只有一个线程在运行JavaScript程序.

setTimeout是异步线程,需要等待js引擎处理完同步代码(while语句)之后才会执行,while语句直接是个死循环,js引擎没有空闲,不会执行下面的alert,也不会插入setTimeout。所以即使这个时候你把setTimeout的时间改成0,他还是不会执行。会先执行while(t){}再alert,但这个循环体是死循环,所以永远不会执行alert。
至于说为什么不执行setTimeout,是因为js的工作机制是:当线程中没有执行任何同步代码的前提下才会执行异步代码,setTimeout是异步代码,所以setTimeout只能等js空闲才会执行,但死循环是永远不会空闲的,所以setTimeout也永远不会执行。

3.

Object.prototype.xiaomo=function(){
return this;
}
var obj1={};
var obj2=Object.create(Object.prototype);//这个就相当于new Object或者{}
var obj3=Object.create(null);//这个是得到一个原型链干净的对象 function notice(a,b){
if(a.xiaomo){
console.log('obj'+b+'有原型xiaomo的方法')
}else{
console.log('obj'+b+'没有原型xiaomo的方法')
}
}
Object.create(null) instanceof Object === false;
notice(obj1,1);
notice(obj2,2);
notice(obj3,3);

 答案是:

 
obj1有原型xiaomo的方法
 
obj2有原型xiaomo的方法
 
obj3没有原型xiaomo的方法

2014PPTV-题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

  10. JSOI2016R3 瞎BB题解

    题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...

随机推荐

  1. 读Lua游戏开发实践指南

    11月11日开读,到今天正好一个月. 起因是被裁员之后,发现很多公司都在使用lua编写cocos2d-x游戏,原因是上手快,技术人员比较便宜. 如果引擎封装比较好,几乎在lua里写写基本逻辑就行了,不 ...

  2. ‘ant-version’不是内部或外部命令,也不是可运行的程序

    下载apache-ant-1.9.2-bin.zip后,解压目录:F:\selenium\apache-ant-1.9.2 配置环境变量,在“我的电脑->属性->高级->环境变量 - ...

  3. 走读openwrt的shell的总结【转】

    原文:http://blog.chinaunix.net/uid-26598889-id-3060543.html ". /etc/diag.sh" 就是将/etc/diag.sh ...

  4. zookeeper 简介

    一.简介 zookeeper是hadoop的一个子项目,A distribute coordination service for distributed applications 为了分布式应用而开 ...

  5. linux-15基础命令之-用户与用户组(useradd,userdel,usermod,passwd,groupadd)

    1.useradd 命令用于创建新的用户,格式为:useradd[选项] 用户名 useradd参数 参数 作用 -d 指定用户的家目录(默认/home/username) -D 展示默认值 -e 帐 ...

  6. SELECT TOP 100 PERCENT 不按后面的order by 排序

    项目中,由于需要把3个状态的任务合并显示,并且按照任务由近及远的顺序排序,类似于下面的语句 order by taskid desc )m union all order by taskid desc ...

  7. Restful.Data 开源持久层组件项目最新进展和使用说明

    Restful.Data 经过 博客园 和 CSDN 的宣传,目前参与该项目的人数已达到 114 人(群号:338570336),虽大部分并不参与实际开发,但他们所提出的意见和建议以及在试用过程中发现 ...

  8. JDBC学习1:详解JDBC使用

    什么是JDBC JDBC(Java Database Connectivity),即Java数据库连接,是一种用于执行SQL语句的Java API,可以为多种关系数据库提供同一访问,它由一组用Java ...

  9. AMD加载器实现笔记(四)

    继续这一系列的内容,到目前为止除了AMD规范中config的map.config参数外,我们已经全部支持其他属性了.这一篇文章中,我们来为增加对map的支持.同样问题,想要增加map的支持首先要知道m ...

  10. Spring-Context之八:一些依赖注入的小技巧

    Spring框架在依赖注入方面是非常灵活和强大的,多了解点一些注入的方式.方法,绝对能优化配置. idref idref属性可以传入一个bean的名称,虽然它是指向一个bean的引用,但是得到的是该b ...