<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>侠客行</title>
	<atom:link href="http://www.raoxia.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.raoxia.com</link>
	<description>技术 &#38; 投资 &#38; 管理</description>
	<lastBuildDate>Mon, 09 Oct 2017 14:18:20 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.7.18</generator>
	<item>
		<title>test</title>
		<link>http://www.raoxia.com/test/</link>
		<comments>http://www.raoxia.com/test/#respond</comments>
		<pubDate>Mon, 09 Oct 2017 14:18:20 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Flash]]></category>

		<guid isPermaLink="false">http://www.raoxia.com/?p=451</guid>
		<description><![CDATA[<p>test</p>]]></description>
				<content:encoded><![CDATA[<p>test</p>
]]></content:encoded>
			<wfw:commentRss>http://www.raoxia.com/test/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CSS单位</title>
		<link>http://www.raoxia.com/css%e5%8d%95%e4%bd%8d/</link>
		<comments>http://www.raoxia.com/css%e5%8d%95%e4%bd%8d/#respond</comments>
		<pubDate>Fri, 05 May 2017 05:01:22 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.raoxia.com/?p=448</guid>
		<description><![CDATA[<p>CSS中可以定义大小的单位有四种px，pt，em，rem，而px可以说在网页开发中最常见的单位了。不过现在如今的大多数网站已经开始用rem这个单位了。那么这四个单位有什么区别呢？ <h4>px&#124;pt&#124;em&#124;rem区别</h4> <h5>px单位</h5> <p>px（像素），国内网站相对来说用得比较多，任意浏览器的默认字体高都是16px。 <h5>pt单位</h5> <p>pt是point，是印刷行业常用单位，等于1/72英寸。 <h5>em单位</h5> <p>em才是真正的“相对单位”，它不是一个具体的数值，而是相对于父元素的属性计算出来的大小，一般移动终端布局用em比较合适。 <h5>rem单位</h5> <p>rem单位是CSS3中新增的一个相对单位，只不过它要比em单位强大一些，因为它是集相对大小和绝对大小的 优点于一身，也就是说它除了有px，pt 的绝对大小属性外，还具备了em的相对大小属性。为什么呢？因为rem这个单位是相对于根元素HTML的。而如果我们想修改大小，只需修改根元素HMTL 的大小就可以了。除了IE8及更早的版本个，目前所有的主流浏览器均支持此属性。 <h4>转换公式：</h4> <p>pt=px乘以3/4<br>倍数em=倍数x16px]]></description>
				<content:encoded><![CDATA[<p>CSS中可以定义大小的单位有四种px，pt，em，rem，而px可以说在网页开发中最常见的单位了。不过现在如今的大多数网站已经开始用rem这个单位了。那么这四个单位有什么区别呢？ </p>
<h4>px|pt|em|rem区别</h4>
<h5>px单位</h5>
<p>px（像素），国内网站相对来说用得比较多，任意浏览器的默认字体高都是16px。 </p>
<h5>pt单位</h5>
<p>pt是point，是印刷行业常用单位，等于1/72英寸。 </p>
<h5>em单位</h5>
<p>em才是真正的“相对单位”，它不是一个具体的数值，而是相对于父元素的属性计算出来的大小，一般移动终端布局用em比较合适。 </p>
<h5>rem单位</h5>
<p>rem单位是CSS3中新增的一个相对单位，只不过它要比em单位强大一些，因为它是集相对大小和绝对大小的 优点于一身，也就是说它除了有px，pt 的绝对大小属性外，还具备了em的相对大小属性。为什么呢？因为rem这个单位是相对于根元素HTML的。而如果我们想修改大小，只需修改根元素HMTL 的大小就可以了。除了IE8及更早的版本个，目前所有的主流浏览器均支持此属性。 </p>
<h4>转换公式：</h4>
<p>pt=px乘以3/4<br />倍数em=倍数x16px</p>
]]></content:encoded>
			<wfw:commentRss>http://www.raoxia.com/css%e5%8d%95%e4%bd%8d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JS中的数组的构造</title>
		<link>http://www.raoxia.com/%e6%b7%b1%e5%a4%9c%e6%9d%a5%e7%9a%84%e4%ba%ba/</link>
		<comments>http://www.raoxia.com/%e6%b7%b1%e5%a4%9c%e6%9d%a5%e7%9a%84%e4%ba%ba/#respond</comments>
		<pubDate>Sun, 13 Jul 2014 07:01:38 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.raoxia.com/?p=397</guid>
		<description><![CDATA[在JS中，数组使用构造函数Array()和运算符new创建的。一般，我们用三种不同的方式来调用Array()创建数组。

&#160;

第一种方式是无参调用：

var a=new Array();

&#160;

它创建的是一个没有元素的空数组。

&#160;

第二种方式通过传递参数明确指定数组前n个元素的值：

var a=new Array(1,2,3,4,5,"testing");

&#160;

这种构造方式的每一个参数都代表了一个元素值，它可以是任意类型的。

&#160;

第三种方式通过Array()构造函数传递给它一个数值参数，这个参数指定了数组的长度：

var a=new Array(10);

&#160;

刚开始，数组的每一个元素值都是undefined.

&#160;

注意，直接调用Array()函数和通过new运算符将Array()作为构造函数调用的结果是一样的，例如var a=Array(1,2,3)和

var a=new Array(1,2,3)等价。

&#160;

利用Array函数的apply方法可以很容易将Argument和其他一些带下标的对象转换为数组：

function test()

{

return Array.apply(this,arguments);

}

其中可以将传给test()函数的实参作为传递给ARRAY()构造函数的参数，从而返回一个数组]]></description>
				<content:encoded><![CDATA[<p>在JS中，数组使用构造函数Array()和运算符new创建的。一般，我们用三种不同的方式来调用Array()创建数组。</p>
<p>&nbsp;</p>
<p>第一种方式是无参调用：</p>
<p>var a=new Array();</p>
<p>&nbsp;</p>
<p>它创建的是一个没有元素的空数组。</p>
<p>&nbsp;</p>
<p>第二种方式通过传递参数明确指定数组前n个元素的值：</p>
<p>var a=new Array(1,2,3,4,5,&#8221;testing&#8221;);</p>
<p>&nbsp;</p>
<p>这种构造方式的每一个参数都代表了一个元素值，它可以是任意类型的。</p>
<p>&nbsp;</p>
<p>第三种方式通过Array()构造函数传递给它一个数值参数，这个参数指定了数组的长度：</p>
<p>var a=new Array(10);</p>
<p>&nbsp;</p>
<p>刚开始，数组的每一个元素值都是undefined.</p>
<p>&nbsp;</p>
<p>注意，直接调用Array()函数和通过new运算符将Array()作为构造函数调用的结果是一样的，例如var a=Array(1,2,3)和</p>
<p>var a=new Array(1,2,3)等价。</p>
<p>&nbsp;</p>
<p>利用Array函数的apply方法可以很容易将Argument和其他一些带下标的对象转换为数组：</p>
<p>function test()</p>
<p>{</p>
<p>return Array.apply(this,arguments);</p>
<p>}</p>
<p>其中可以将传给test()函数的实参作为传递给ARRAY()构造函数的参数，从而返回一个数组</p>
]]></content:encoded>
			<wfw:commentRss>http://www.raoxia.com/%e6%b7%b1%e5%a4%9c%e6%9d%a5%e7%9a%84%e4%ba%ba/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>管理自己，一辈子的职场</title>
		<link>http://www.raoxia.com/%e7%ae%a1%e7%90%86%e8%87%aa%e5%b7%b1%ef%bc%8c%e4%b8%80%e8%be%88%e5%ad%90%e7%9a%84%e8%81%8c%e5%9c%ba-7/</link>
		<comments>http://www.raoxia.com/%e7%ae%a1%e7%90%86%e8%87%aa%e5%b7%b1%ef%bc%8c%e4%b8%80%e8%be%88%e5%ad%90%e7%9a%84%e8%81%8c%e5%9c%ba-7/#respond</comments>
		<pubDate>Sun, 13 Jul 2014 04:08:00 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[投资和管理]]></category>

		<guid isPermaLink="false">http://www.raoxia.com/?p=387</guid>
		<description><![CDATA[<p>本文是《哈佛商业评论》创刊以来重印次数最多的文章之一。作者彼得·德鲁克，自1971年后长期在美国加利福尼亚州克莱尔蒙特研究生大学任教。该文首次发表于1999年，节选自其著作《21世纪的管理挑战》，本文有删节。 <br/><br/>我们生活的这个时代充满着前所未有的机会：如果你有雄心，又不乏智慧，那么不管你从何处起步，你都可以沿着自己所选择的道路登上事业的顶峰。 <br/><br/>不过，有了机会，也就有了责任。今天的公司并不怎么管员工的职业发展；实际上，知识工作者必须成为自己的首席执行官。你应该在公司中开辟自己的天地，知道何时改变发展道路，并在可能长达50年的职业生涯中不断努力、干出实绩。要做好这些事情，你首先要对自己有深刻的认识——不仅清楚自己的优点和缺点，也知道自己是怎样学习新知识和与别人共事的，并且还明白自己的价值观是什么、自己又能在哪些方面做出最大贡献。因为只有当所有工作都从自己的长处着眼，你才能真正做到卓尔不群。 <br/><br/>历史上的伟人——拿破仑、达芬奇、莫扎特——都很善于自我管理。这在很大程度上也是他们成为伟人的原因。不过，他们属于不可多得的奇才，不但有着不同于常人的天资，而且天生就会管理自己，因而才取得了不同于常人的成就。而我们当中的大多数人，甚至包括那些还算有点天赋的人，都不得不通过学习来掌握自我管理的技巧。我们必须学会自我发展，必须知道把自己放在什么样的位置上，才能做出最大的贡献，而且还必须在长达50年的职业生涯中保持着高度的警觉和投入——也就是说，我们得知道自己应该何时换工作，以及该怎么换。 <br/><br/>【我的长处是什么】<br/><br/>多数人都以为他们知道自己擅长什么。其实不然，更多的情况是，人们只知道自己不擅长什么——即便是在这一点上，人们也往往认识不清。然而，一个人要有所作为，只能靠发挥自己的长处，而如果从事自己不太擅长的工作是无法取得成就的，更不用说那些自己根本干不了的事情了。 <br/><br/>以前的人没有什么必要去了解自己的长处，因为一个人的出身就决定了他一生的地位和职业：农民的儿子也会当农民，工匠的女儿会嫁给另一个工匠等。但是，现在人们有了选择。我们需要知己所长，才能知己所属。 <br/><br/>要发现自己的长处，唯一途径就是回馈分析法（feedback analysis）。每当做出重要决定或采取重要行动时，你都可以事先记录下自己对结果的预期。9到 12个月后，再将实际结果与自己的预期比较。我本人采用这种方法已有15到20年了，而每次使用都有意外的收获。比如，回馈分析法使我看到，我对专业技术人员，不管是工程师、会计师还是市场研究人员，都容易从直觉上去理解他们。这令我大感意外。它还使我看到，我其实与那些涉猎广泛的通才没有什么共鸣。 <br/><br/>回馈分析法并不是什么新鲜的东西。早在14世纪，这种方法由一个原本会永远默默无闻的德国神学家发明，大约150年后被法国神学家约翰·加尔文和西班牙神学家圣依纳爵分别采用。他们都把这种方法用于其信徒的修行。事实上，回馈分析法使他们的信徒养成了一种始终注重实际表现和结果的习惯，这也是他们创立的教派——加尔文教会和耶稣会——能够主宰欧洲长达30年的原因。 <br/><br/>我们只要持之以恒地运用这个简单的方法，就能在较短的时间内（可能两三年），发现自己的长处——这是你需要知道的最重要的事情。在采用这种方法之后，你就能知道，自己正在做（或没有做）的哪些事情会让你的长处无法发挥出来。同时，你也将看到自己在哪些方面能力不是特别强。最后，你还将了解到自己在哪些方面完全不擅长，做不出成绩来。 <br/><br/>根据回馈分析的启示，你需要在几方面采取行动。首先最重要的是，专注于你的长处，把自己放到那些能发挥长处的地方。 <br/><br/>其次，加强你的长处。回馈分析会迅速地显示，你在哪些方面需要改善自己的技能或学习新技能。它还将显示你在知识上的差距——这些差距通常都可以弥补。数学家是天生的，但是人人都能学习三角学。 <br/><br/>第三，发现任何由于恃才傲物而造成的偏见和无知，并且加以克服。有太多的人，尤其是那些术业有专攻的人，往往对其他领域的知识不屑一顾，或者认为聪明的头脑就可取代知识。比如，很多一流的工程师遇上与人相关的事就束手无策，他们还以此为荣——因为他们觉得，对条理清晰的工程师头脑来说，人太混乱无序了。与此形成鲜明对照的是，人力资源方面的专业人员常常以他们连基本的会计知识或数量分析都一无所知而自傲。不过，人们要是对这样的无知还沾沾自喜的话，那无异于自取灭亡。其实，要让自己的长处得到充分发挥，你就应该努力学习新技能、汲取新知识。 <br/><br/>另外一点也同样重要——纠正你的不良习惯。所谓不良习惯，是指那些会影响你的工作成效和工作表现的事情。这样的习惯能很快地在回馈中反映出来。例如，一位企划人员可能发现自己美妙的计划最终落空，原因是他没有把计划贯彻到底。同那些才华横溢的人一样，他也相信好的创意能够移动大山。但是，真正移山的是推土机，创意只不过是为推土机指引方向，让它知道该到何处掘土。这位企划人员必须意识到不是计划做好就大功告成，接下来还得找人执行计划，并向他们解释计划，在付诸行动前须做出及时的调整和修改，最后要决定何时中止计划。 <br/><br/>与此同时，回馈还会反映出哪些问题是由缺乏礼貌造成的。礼貌是一个组织的润滑剂。两个移动物相互接触时发生摩擦是一个自然规律，不仅无生命的物体是这样，人类也是如此。礼貌，其实也很简单，无非是说声“请”和“谢谢”，记住别人的名字，或问候对方家人这样的小事，但就是这种不起眼的细节，使得两个人能够融洽相处，不管他们彼此之间是否有好感。许多聪明人，尤其是聪明的年轻人，没有意识到这一点。如果回馈分析表明某个人只要一遇到需要别人合作的事就屡屡失败，那么很可能就意味着这个人的举止不大得体——也就是缺乏礼貌。 <br/><br/>把预期和实际结果进行比较，也会发现自己不能做什么。我们每个人都有许多一窍不通、毫无天分的领域，在这些领域我们甚至连平庸的水平都达不到。人们，尤其是知识工作者，就不应该试图去完成这些领域的工作和任务。他们应该尽量少把精力浪费在那些不能胜任的领域上，因为从无能到平庸要比从一流到卓越需要人们付出多得多的努力。然而，大多数人，尤其是教师，还有组织，都一门心思要把能力低下的人变成合格者。其实，他们还不如把精力、资源和时间花在将称职者培养成佼佼者上。 <br/><br/>【我的工作方式是怎样的】<br/><br/>令人惊讶的是，很少有人知道自己平时是怎样把事情给做成的。实际上，我们当中的大多数人甚至不知道不同人有着不同的工作方式和表现。许多人不是以他们习惯的方式工作，这当然就容易造成无所作为。对于知识工作者来说，“我的工作方式是怎样的？”可能比“我的长处是什么？”这个问题更加重要。 <br/><br/>同一个人的长处一样，一个人的工作方式也是独一无二的。这由人的个性决定。不管个性是先天决定的，还是后天培养的，它肯定是早在一个人进入职场前就形成了。正如一个人擅长什么、不擅长什么是既定的一样，一个人的工作方式也基本固定，它可以略微有所调整，但是不可能完全改变——当然也不会轻易改变。而且就像人们从事自己最拿手的工作容易做出成绩一样，他们要是采取了自己最擅长的工作方式也容易取得成就。通常，几个常见的个性特征就决定了一个人的工作方式。 <br/><br/>我属于读者型，还是听者型？首先，你要搞清楚的是，你是读者型（习惯阅读信息）还是听者型（习惯听取信息）的人。绝大多数人甚至都不知道还有读者型和听者型之说，而且很少有人既是读者型又是听者型。知道自己属于哪种类型的人更少。但是，有一些例子说明了这样的无知可能造成多大的危害。 <br/><br/>德怀特·艾森豪威尔担任欧洲盟军最高统帅时，一直是新闻媒体的宠儿。他的记者招待会以其独特的风格出名——不管记者提出什么问题，艾森豪威尔将军都从容地对答如流。无论是介绍情况，还是解释政策，他都能够用两三句言简意赅的话就说清楚。十年后，艾森豪威尔当上了总统，当年曾对他十分崇拜的同一批记者，这时却公开瞧不起他。他们抱怨说，他从不正面回答问题，而是喋喋不休地胡侃着其他事情。他们总是嘲笑他回答问题时语无伦次，不合乎语法，糟蹋标准英语。 <br/><br/>艾森豪威尔显然不知道自己属于读者型，而不是听者型。当他担任欧洲盟军最高统帅时，他的助手设法确保媒体提出的每一个问题至少在记者招待会开始前半小时以书面形式提交。这样，艾森豪威尔就完全掌握了记者提出的问题。而当他就任总统时，他的两个前任都是听者型——富兰克林·罗斯福和哈里·杜鲁门。这两位总统知道自己是听者型的，并且都喜欢举行畅所欲言的记者招待会。艾森豪威尔可能认为他必须去做两位前任所做的事。可是，他甚至连记者们在问些什么都从来没听清楚过。而且，艾森豪威尔并不是个极端的例子。 <br/><br/>几年后，林登·约翰逊把自己的总统职位给搞砸了，这在很大程度上是因为他不知道自己是听者型的人。他的前任约翰·肯尼迪是个读者型的人，他搜罗了一些出色的笔杆子当他的助手，要求他们每次进行当面讨论之前务必先给他写通报。约翰逊留下了这些人，他们则继续写通报。可是他显然根本看不懂他们写的东西。不过，约翰逊以前当参议员时曾经表现非凡，因为议员首先必须是听者型。 <br/><br/>没有几个听者型的人可以通过努力变成合格的读者型——不管是主动还是被动的努力，反之亦然。因此，试图从听者型转为读者型的人会遭受林登·约翰逊的命运，而试图从读者型转为听者型的人会遭受德怀特·艾森豪威尔的命运。他们都不可能发挥才干或取得成就。 <br/><br/>【我如何学习】 <br/><br/>要了解一个人的工作方式，需要弄清的第二点是，他是如何学习的。许多一流的笔杆子都不是好学生——温斯顿·邱吉尔就是一例。在他们的记忆中，上学往往是十足的折磨。然而，他们的同学有这种记忆的却很少。他们可能在学校里得不到什么乐趣，对他们来说上学的最大痛苦是无聊。有关这个问题的解释是，笔头好的人一般不靠听和读来学习，而靠写来学习，这已成了一种规律。学校不让他们以这种方式学习，所以他们的成绩总是很糟糕。 <br/><br/>所有的学校都遵循这样的办学思路：只有一种正确的学习方式，而且人人都得遵从。但是，对学习方式跟别人不大一样的学生来说，被迫按学校教的方式来学习就是地狱。实际上，学习大概有六七种不同的方式。 <br/><br/>像邱吉尔这样的人靠写来学习。还有些人以详尽的笔记来学习。例如，贝多芬留下了许多随笔小抄，然而他说，实际上他作曲时从来不看这些随笔小抄。当被问及他为什么还要用笔记下来时，据说他回答道：“如果我不马上写下来的话，我很快就会忘得一干二净。如果我把它们写到小本子上，我就永远不会忘记了，也用不着再看一眼。”有些人在实干中学习。另一些人通过听自己讲话学习。 <br/><br/>我认识一位公司总经理，他把一个平庸的小家族企业发展成行业领军企业。他是一个通过讲话学习的人。他习惯于每周一次把全体高层管理人员召集到他的办公室，随后对他们讲上两三个小时。他总是提出政策性问题，在每一个问题上提出三种不同观点。但他很少请这帮同事发表意见或提出问题，他只需要听众听他讲话。这就是他的学习方式。虽然他是一个比较极端的例子，但是通过讲话学习绝不是一种少见的方法。成功的出庭律师也以同样的方式学习，许多诊断医师也是如此（我自己也是这样）。 <br/><br/>在所有最重要的自我认识当中，最容易做到的就是知道自己是怎样学习的。当我问人们：“你怎么学习？”大多数人都知道答案。但是，当我问：“你根据这个认识来调整自己的行为吗？”没有几个人回答“是”。然而，知行合一是取得成就的关键；如果知行不合一，人们就会无所作为。 <br/><br/>我属于读者型还是听者型？我如何学习？这是你首先要问自己的问题。但是，光这些问题显然不够。要想做好自我管理，你还需要问这样的问题：我能与别人合作得好吗？还是喜欢单枪匹马？如果你确实有与别人进行合作的能力，你还得问问这个问题：我在怎样的关系下与他人共事？ <br/><br/>有些人最适合当部属。二战时期美国的大英雄乔治·巴顿将军是一个很好的例子。巴顿是美军的一名高级将领。然而，当有人提议他担任独立指挥官时，美国陆军参谋长、可能也是美国历史上最成功的伯乐，乔治·马歇尔将军说：“巴顿是美国陆军造就的最优秀的部下，但是，他会成为最差劲的司令官。” <br/><br/>一些人作为团队成员工作最出色。另一些人单独工作最出色。一些人当教练和导师特别有天赋，另一些人却没能力做导师。 <br/><br/>另一个关键的问题是，我如何才能取得成果——是作为决策者还是作为顾问？许多人做顾问时的表现会很出色，但是不能够承担决策的负担和压力。与此相反，也有许多人需要顾问来迫使他们思考，随后他们才能做出决定，接着迅速、自信和大胆地执行决定。 <br/><br/>顺便说一下，一个组织的二号人物在提升到一号职位时常常失败，也正是因为这个原因。最高职位需要一个决策者，而一个强势的决策者常常把其信赖的人放在二号位置，当他的顾问。顾问在二号位置上往往是很出色的，但是换到一号位置，他就不行了。他虽然知道应该做出什么样的决定，但是不能接受真正做决定的责任。 <br/><br/>其他有助于认识自我的重要问题包括：我是在压力下表现出色，还是适应一种按部就班、可预测的工作环境？我是在一个大公司还是在一个小公司中工作表现最佳？在各种环境下都工作出色的人寥寥无几。我不止一次地看到有些人在大公司中十分成功，换到小公司中则很不顺利。反过来也是如此。 <br/><br/>下面这个结论值得我们反复强调：不要试图改变自我，因为这样你不大可能成功。但是，你应该努力改进你的工作方式。另外，不要从事你干不了或干不好的工作。 <br/><br/>【我的价值观是什么】<br/><br/>要能够自我管理，你最后不得不问的问题是：我的价值观是什么？这不是一个有关伦理道德的问题。道德准则对每一个人都一样。要对一个人的道德进行测试，方法很简单。我把它称为“镜子测试”。 <br/><br/>20世纪初，德国驻英国大使是当时在伦敦所有大国中最受尊重的一位外交官。显然，他命中注定会承担重任，即使不当本国的总理，至少也要当外交部长。然而，在1906年，他突然辞职，不愿主持外交使团为英国国王爱德华七世举行的晚宴。这位国王是一个臭名昭著的色鬼，并且明确表示他想出席什么样的晚宴。据有关报道，这位德国大使曾说：“我不想早晨刮脸时在镜子里看到一个皮条客。” <br/><br/>这就是镜子测试。我们所尊从的伦理道德要求你问自己：我每天早晨在镜子里想看到一个什么样的人？在一个组织或一种情形下合乎道德的行为，在另一个组织或另一种情形下也是合乎道德的。但是，道德只是价值体系的一部分——尤其对于一个组织的价值体系来说。 <br/><br/>如果一个组织的价值体系不为自己所接受或者与自己的价值观不相容，人们就会备感沮丧，工作效力低下。 <br/><br/>让我们来看看一位十分成功的人力资源主管的经历。这位主管所在的公司被一家大企业收购。收购之后，她得到了提升，从事的是她以前做得最出色的工作，包括为重要职位挑选人才。这位主管深信，在选人时，公司只有在排除内部的所有可能人选后才能从外部招聘人才。但是她的新公司认为应该首先从外部招聘，以吸收新鲜血液。对于这两种方式，需要说明的一点是，根据我的经验，适当的方式是两者兼顾。然而，这两种方式在根本上是互不相容的——表面上是政策不同，实质是价值观的不同。这说明在该公司人们对以下三个问题有着不同看法：组织与员工之间是怎样的关系；组织应该为员工以及员工的发展承担何种责任；一个人对企业最重要的贡献是什么。经过几年挫折，这位主管最终辞职——尽管她的经济损失很大。她的价值观和这个组织的价值观就是无法融合。 <br/><br/>同样，一家制药公司无论是通过不断的小幅改进，还是通过几次费用高昂、风险巨大的“突破”来取得出色业绩，都主要不是一个经济问题。这两种战略的结果可能都差不多。实质上，这是两种价值体系之间的冲突。一种价值体系认为公司的贡献是帮助医生把他们已经在做的工作锦上添花，另一种价值体系的取向是进行更多的科学发现。 <br/><br/>至于一个企业的经营是着眼于短期结果，还是注重长远发展，这同样是价值观问题。财务分析师认为，企业可两者同时兼顾。成功的企业家知道得更清楚。诚然，每一家公司都必须取得短期成果。但是在短期成果与长期增长之间的冲突中，每一家公司都将决定自己所选择的重点。从根本上说，这是一种关于企业职能与管理层责任的价值观冲突。 <br/><br/>价值观冲突并不限于商业组织。美国发展最快的一个牧师教会，衡量工作成败的尺度是新教徒的人数。它的领导层认为，重要的是有多少新教徒入会。随后，上帝将满足他们的精神需求，或者至少会满足足够比例的新教徒的需求。另一个福音派牧师教会认为，重要的是人们的精神成长。这个教会慢慢地让那些形式上入会但精神上并没有融入教会生活的新教徒选择了离开。 <br/><br/>这同样不是一个数量问题。乍一看，第二个教会好像发展较慢。但是，它留住新教徒的比例要远高于第一个。换言之，它的发展比较稳固。这也不是一个神学问题，至少首先并不是神学问题，而是有关价值观的问题。在一次公开辩论中，一位牧师这样说：“除非你先加入教会，否则你永远找不到天国之门。” <br/><br/>而另一位牧师反驳说：“不，除非你先有心寻找天国之门，否则你就不属于教会。” <br/><br/>组织和人一样，也有价值观。为了在组织中取得成效，个人的价值观必须与这个组织的价值观相容。两者的价值观不一定要相同，但是必须相近到足以共存。不然，这个人在组织中不仅会感到沮丧，而且做不出成绩。 <br/><br/>一个人的工作方式和他的长处很少发生冲突，相反，两者能产生互补。但是，一个人的价值观有时会与他的长处发生冲突。一个人做得好甚至可以说是相当好、相当成功的事情——可能与其价值体系不吻合。在这种情况下，这个人所做的工作似乎并不值得贡献毕生的精力（甚至没必要贡献太多的精力）。 <br/><br/>如果可以，请允许我插入一段个人的故事。多年前，我也曾不得不在自己的价值观和做得很成功的工作之间做出选择。20世纪30年代中期，我还是一个年轻人，在伦敦做投资银行业务，工作非常出色。这项工作显然能发挥我的长处。然而，我并不认为自己担任资产管理人是在做贡献。我认识到，我所重视的是对人的研究。我认为，一生忙于赚钱、死了成为墓地中的最大富翁没有任何意义。当时我没有钱，也没有任何就业前景。尽管当时大萧条仍在持续，我还是辞去了工作。这是一个正确的选择。换言之，价值观是并且应该是最终的试金石。 <br/><br/>【我属于何处】<br/><br/>少数人很早就知道他们属于何处。比如，数学家、音乐家和厨师，通常在四五岁的时候就知道自己会成为数学家、音乐家和厨师了。物理学家通常在十几岁甚至更早的时候就决定了自己的工作生涯。但是，大多数人，尤其是很有天赋的人，至少要过了二十五六岁才知道他们将身属何处。然而，到这个时候，他们应该知道上面所谈的三个问题的答案：我的长处是什么？我的工作方式是怎样的？我的价值观是什么？随后，他们就能够并且应该决定自己该向何处投入精力。 <br/><br/>或者，他们应该能够决定自己不属于何处。已经知道自己在大公司里干不好的人，应该学会拒绝在一个大公司中任职。已经知道自己不适合担任决策者的人，应该学会拒绝做决策工作。巴顿将军（他自己大概永远不知道这一点）本来应该学会拒绝担任独立总指挥的。 <br/><br/>同样重要的是，知道上述三个问题的答案，也使得一个人能够坦然接受一个机会、一个邀请或一项任务。“是的，我将做这件事。但是，我将按照我自己的特点，采取这样的方式来做这件事，进行这样的组织安排，这样来处理当中所牵涉的关系。这是我在这个时间范围内应该会取得的成果，因为这就是我。” <br/><br/>成功的事业不是预先规划的，而是在人们知道了自己的长处、工作方式和价值观后，准备把握机遇时水到渠成的。知道自己属于何处，可使一个勤奋、有能力但原本表现平平的普通人，变成出类拔萃的工作者。 <br/><br/>【我该做出什么贡献】<br/><br/>综观人类的发展史，绝大多数人永远都不需要提出这样一个问题：我该做出什么贡献？因为他们该做出什么贡献是由别人告知的，他们的任务或是由工作本身决定的（例如农民或工匠的任务），或是由主人决定的（例如佣人的任务）。以前的人大多都处于从属地位，别人吩咐他们做什么，就做什么，这被认为是理所当然的。甚至到了20世纪50年代和60年代，那时涌现出的知识工作者（即所谓的“组织人”， organization man）还指望公司的人事部为他们做职业规划。 <br/><br/>随后，到20世纪60年代末，就再没有人想让别人来安排自己的职业生涯了。年轻的男男女女开始提出这个问题：我想做什么？而他们所听到的答案就是“你们自行其是吧”。但是，这种回答同“组织人”听命公司的做法一样错误。那些相信自行其是就能做出贡献、实现抱负、取得成功的人，一般连三点中的任何一点都做不到。 <br/><br/>尽管如此，我们还是不能走回头路，让别人来吩咐、安排自己要干什么。对于知识工作者来说，他们还不得不提出一个以前从来没有提出过的问题：我的贡献应该是什么？要回答这个问题，他们必须考虑三个不同的因素：当前形势的要求是什么？鉴于我的长处、我的工作方式以及我的价值观，我怎样才能对需要完成的任务做出最大贡献？最后，必须取得什么结果才能产生重要影响？ <br/><br/>请看一位新任命的医院院长的经历。这是一所享有盛名的大医院，30年来一直就靠名气顺利经营着。新院长上任后决定了自己应做的贡献：两年内在医院的某个重要领域建立起卓越服务的标准。他决定以急诊室为重点，因为该院的急诊室地方比较大，受人注意，而又秩序混乱。他决定，到急诊室就诊的每一个患者必须在60秒钟之内由一名合格的护士接待。一年之内，该医院的急诊室变成了美国所有医院的样板，又过了两年，整个医院的面貌焕然一新。 <br/><br/>正如这个事例所表明的，把眼光放得太远是不大可能的——甚至不是特别有效。一般来说，一项计划的时间跨度如果超过了 18个月，就很难做到明确和具体。因此，在多数情况下我们应该提出的问题是：我在哪些方面能取得将在今后一年半内见效的结果？如何取得这样的结果？回答这个问题时必须对几个方面进行权衡。首先，这些结果应该是比较难实现的——用当前的一个时髦词说，就是要有“张力” （stretching）。但是，这些结果也应该是能力所及的。设定一个不能实现的目标或者只能在可能性微乎其微的情况下实现的目标，根本不能叫雄心勃勃，简直就是愚蠢。其次，这些结果应该富有意义，要能够产生一定影响。最后，结果应该明显可见，如果可能的话，还应当能够衡量。确定了要实现的结果之后，接着就可以制订行动方针：做什么，从何处着手，如何开始，目标是什么，在多长时间内完成。 <br/><br/>【对人际关系负责】<br/><br/>除了少数伟大的艺术家、科学家和运动员，很少有人是靠自己单枪匹马而取得成果的。不管是组织成员还是个体职业者，大多数人都要与别人进行合作，并且是有效的合作。要实现自我管理，你需要对自己的人际关系负起责任。这包括两部分内容。 <br/><br/>首先是要接受别人是和你一样的个体这个事实。他们会执意展现自己作为人的个性。这就是说，他们也有自己的长处，自己的做事方式和自己的价值观。因此，要想卓有成效，你就必须知道共事者的长处、工作方式和价值观。这个道理听起来让人很容易明白，但是没有几个人真正会去注意。一个习惯于写报告的人就是个典型的例子——他在第一份工作时就培养起写报告的习惯，因为他的老板是一个读者型的人，而即使下一个老板是个听者型，此人也会继续写着那肯定没有任何结果的报告。这位老板因此肯定会认为这个员工愚蠢、无能、懒惰，肯定干不好工作。但是，如果这个员工事先研究过新老板的情况，并分析过这位老板的工作方式，这种情况本来可以避免。 <br/><br/>老板既不是组织结构图上的一个头衔，也不是一个“职能”。他们是有个性的人，他们有权以自己最得心应手的方式来工作。与他们共事的人有责任观察他们，了解他们的工作方式，并做出相应的自我调整，去适应老板最有效的工作方式。事实上，这就是“管理”上司的秘诀。 <br/><br/>这种方法适用于所有与你共事的人。每个人都有他自己的做事方法，也有权按照自己的方式来工作，而不是按你的方法来工作。重要的是，他们能否有所作为以及他们持有什么样的价值观。至于工作方式，人各有别。提高效力的第一个秘诀是了解跟你合作和你要依赖的人，以利用他们的长处、工作方式和价值观。工作关系应当既以工作为基础，也以人为基础。 <br/><br/>人际关系责任的第二部分内容是沟通责任。在我或是其他人开始给一个组织做咨询时，我们听到的第一件事都与个性冲突有关。其中大部分冲突都是因为：人们不知道别人在做什么，他们又是采取怎样的工作方式，专注于做出什么样的贡献以及期望得到怎样的结果。而这些人不了解情况的原因是，他们没有去问，结果也就不得而知。 <br/><br/>这种不去问明情况的做法，与其说是反映了人类的愚蠢，倒不如说是历史使然。在以前，人们没必要把这些情况告诉任何人。比如在中世纪的城市，一个区的每一个人从事的行业都一样。在乡村，土地刚一解冻，山谷里的每一个人就开始播种同一种农作物。即使有少数人做的事情和大家不一样，他们也是单独工作，因此不需要告诉任何人他们在做什么。 <br/><br/>而现在，大多数人都与承担着不同任务和责任的人一道工作。市场营销副总裁可能是销售出身，知道有关销售的一切，但是，对于自己从未做过的事情，比如定价、广告、包装等等，就一无所知了。所以，那些正在做这些工作的人必须确保营销副总裁懂得他们设法做的是什么、他们为什么要做这件事、他们将如何去做以及期望取得什么结果。 <br/><br/>如果营销副总裁不懂得这些高层次的、知识型的专业人士在做什么，错主要在后者身上，而不在自己。反过来说，营销副总裁的责任则是确保他的所有同事都知道自己是怎样看待营销这项工作的：他的目标是什么、他如何工作，以及他对他本人和他的每一个同事有什么期望。 <br/><br/>即使一些人懂得负起人际关系责任的重要性，他们和同事的交流也往往不够。他们总是有所顾虑，怕别人把自己看成是一个冒昧、愚蠢、爱打听的人。他们错了。因为我们看到，每当有人找到他的同事说“这是我所擅长的工作。这是我的做事方式。这是我的价值观。这是我计划做出的贡献和应当取得的成果”，这个人总会得到如此回答：“这太有帮助了，可你为什么不早点告诉我？” <br/><br/>如果一个人继续问道：“那么，关于你的长处、你的工作方式、你的价值观以及你计划做出的贡献，我需要知道什么？”他也会得到类似的答复——据我的经验，无一例外。事实上，知识工作者应该向与他们共事的每一个人，不管是下属、上司、同事还是团队成员，都发出这样的疑问。而且，每次提出此类问题，都会得到这样的回答：“谢谢你来问我。但是，你为什么不早点问我？” <br/><br/>组织已不再建立在强权的基础上，而是建立在信任的基础上。人与人之间相互信任，不一定意味着他们彼此喜欢对方，而是意味着彼此了解。因此，人们绝对有必要对自己的人际关系负责。这是一种义务。不管一个人是公司的一名成员，还是公司的顾问、供应商或经销商，他都需要对他的所有共事者负起这种责任。所谓共事者，是指在工作上他所依赖的同事以及依赖他的同事。 <br/><br/>【管理后半生】 <br/><br/>当多数人的工作是体力劳动时，你不必为自己的后半生担心。你只要继续从事你一直在做的工作就行了。如果你够幸运，能在工厂或铁路辛勤工作40年后撑下来，你就可以快乐地度过余生，什么也用不着干。然而，现在的多数工作都是知识工作，而知识工作者在干了40年后，仍能发挥余热，他们只是有些厌倦。 <br/><br/>我们听到了许多有关经理人中年危机的谈论，“厌倦”这个词在其中频频出现。45岁时，多数经理人的职业生涯达到了顶峰，他们也知道这一点。在做了 20年完全相同的工作之后，他们已经得心应手。但是他们学不到新东西，也没有什么新贡献，从工作中得不到挑战，因而也谈不上满足感。然而，在他们面前，还有20到25年的职业道路要走。这就是为什么经理人在进行自我管理后，越来越多地开始发展第二职业的原因。 <br/><br/>发展第二职业有三种方式。第一种是完全投身于新工作。这常常只需要从一种组织转到另一种组织。例如，一家大公司某事业部的会计师成为一家中型医院的财务总监。但是也有越来越多的人转入完全不同的职业。例如，公司经理在45岁时进入政府内阁；或者中层管理人员在公司工作20年后离职，到法学院进修，成为一个小镇的律师。 <br/><br/>还有许多人在第一份职业中取得的成功有限，于是改行从事第二职业。这样的人有很多技能，他们也知道该如何工作。而且，他们需要一个社群——因为孩子已长大单飞，剩下一座空屋。他们也需要收入。但最重要的是，他们需要挑战。 <br/><br/>为后半生做准备的第二种方式是，发展一个平行的职业。许多人的第一职业十分成功，他们还会继续从事原有工作，或全职或兼职，甚至只是当顾问。但是，除此之外，他们会开创一项平行的工作，通常是在非营利机构，每周占用10个小时。例如，他们可能接手教会的管理，或者担任当地女童子军顾问委员会主席。他们也可能管理受虐妇女庇护所，担任当地公共图书馆的儿童图书管理员，或在学校董事会任职等。 <br/><br/>最后一种方法是社会创业。社会创业者通常是在第一职业中非常成功的人士。他们都热爱自己的工作，但是这种工作对他们已经不再有挑战性。在许多情况下，他们虽然继续做着原来的工作，但在这份工作上花的时间越来越少。他们同时开创了另一项事业，通常是非营利性活动。例如，我的朋友鲍勃·布福德创办了一个非常成功的电视公司，现在他仍然经营着。但与此同时，他还创建了一个与新教教会合作的非营利组织，也做得非常成功。现在他又创建了一个组织，专门指导社会创业者在经营原有业务的同时，如何管理自己另外创办的非营利机构。 <br/><br/>管理好自己后半生的人可能总是少数。多数人可能“一干到底”，数着年头一年一年过去，直至退休。但是，正是这些少数人，这些把漫长的工作寿命看做是自己和社会之机会的男男女女，才会成为领袖和模范。 <br/><br/>在一个崇尚成功的社会里，拥有各种选择变得越来越重要。从历史上来看，却没有“成功”一说。绝大多数人只期望坚守“适当的位置”。唯一的流动性是向下的流动性。然而，在知识社会里，我们期望每一个人都能取得成功。这显然是不可能的。对许多人来说，能避免失败就行。可是有成功的地方，就会有失败。因此，有一个能够让人们做出贡献、发挥影响力或成为“大人物”的领域，这不仅对个人十分重要，对个人的家庭也同样重要。这意味着人们需要找到一个能够有机会成为领袖、受到尊重、取得成功的第二领域——可能是第二份职业，也可能是平行的职业或社会创业。 <br/><br/>自我管理中面临的挑战看上去比较明显，甚至非常基本，其答案可能不言自明，甚至近乎幼稚。但是，自我管理需要个人，尤其是知识工作者，做出以前从未做过的事情。实际上，自我管理需要每一个知识工作者在思想和行动上都要成为自己的首席执行官。更进一步来看，这样的转变——从一切听从别人吩咐的体力劳动者到不得不自我管理的知识工作者——也使得社会结构发生了深刻变化。历史上每一个社会，甚至是个人主义倾向最强的社会，都认为两件事情理所当然（即使只是下意识的）：第一，组织比员工更长寿；第二，大多数人从不挪地方。 <br/><br/>如今，情况恰恰相反。知识工作者的寿命超过了组织寿命，而且他们来去自如。于是，人们对自我管理的需要在人类事务中掀起了一场革命。</p>]]></description>
				<content:encoded><![CDATA[<p>本文是《哈佛商业评论》创刊以来重印次数最多的文章之一。作者彼得·德鲁克，自1971年后长期在美国加利福尼亚州克莱尔蒙特研究生大学任教。该文首次发表于1999年，节选自其著作《21世纪的管理挑战》，本文有删节。 </p>
<p>我们生活的这个时代充满着前所未有的机会：如果你有雄心，又不乏智慧，那么不管你从何处起步，你都可以沿着自己所选择的道路登上事业的顶峰。 </p>
<p>不过，有了机会，也就有了责任。今天的公司并不怎么管员工的职业发展；实际上，知识工作者必须成为自己的首席执行官。你应该在公司中开辟自己的天地，知道何时改变发展道路，并在可能长达50年的职业生涯中不断努力、干出实绩。要做好这些事情，你首先要对自己有深刻的认识——不仅清楚自己的优点和缺点，也知道自己是怎样学习新知识和与别人共事的，并且还明白自己的价值观是什么、自己又能在哪些方面做出最大贡献。因为只有当所有工作都从自己的长处着眼，你才能真正做到卓尔不群。 </p>
<p>历史上的伟人——拿破仑、达芬奇、莫扎特——都很善于自我管理。这在很大程度上也是他们成为伟人的原因。不过，他们属于不可多得的奇才，不但有着不同于常人的天资，而且天生就会管理自己，因而才取得了不同于常人的成就。而我们当中的大多数人，甚至包括那些还算有点天赋的人，都不得不通过学习来掌握自我管理的技巧。我们必须学会自我发展，必须知道把自己放在什么样的位置上，才能做出最大的贡献，而且还必须在长达50年的职业生涯中保持着高度的警觉和投入——也就是说，我们得知道自己应该何时换工作，以及该怎么换。 </p>
<p>【我的长处是什么】</p>
<p>多数人都以为他们知道自己擅长什么。其实不然，更多的情况是，人们只知道自己不擅长什么——即便是在这一点上，人们也往往认识不清。然而，一个人要有所作为，只能靠发挥自己的长处，而如果从事自己不太擅长的工作是无法取得成就的，更不用说那些自己根本干不了的事情了。 </p>
<p>以前的人没有什么必要去了解自己的长处，因为一个人的出身就决定了他一生的地位和职业：农民的儿子也会当农民，工匠的女儿会嫁给另一个工匠等。但是，现在人们有了选择。我们需要知己所长，才能知己所属。 </p>
<p>要发现自己的长处，唯一途径就是回馈分析法（feedback analysis）。每当做出重要决定或采取重要行动时，你都可以事先记录下自己对结果的预期。9到 12个月后，再将实际结果与自己的预期比较。我本人采用这种方法已有15到20年了，而每次使用都有意外的收获。比如，回馈分析法使我看到，我对专业技术人员，不管是工程师、会计师还是市场研究人员，都容易从直觉上去理解他们。这令我大感意外。它还使我看到，我其实与那些涉猎广泛的通才没有什么共鸣。 </p>
<p>回馈分析法并不是什么新鲜的东西。早在14世纪，这种方法由一个原本会永远默默无闻的德国神学家发明，大约150年后被法国神学家约翰·加尔文和西班牙神学家圣依纳爵分别采用。他们都把这种方法用于其信徒的修行。事实上，回馈分析法使他们的信徒养成了一种始终注重实际表现和结果的习惯，这也是他们创立的教派——加尔文教会和耶稣会——能够主宰欧洲长达30年的原因。 </p>
<p>我们只要持之以恒地运用这个简单的方法，就能在较短的时间内（可能两三年），发现自己的长处——这是你需要知道的最重要的事情。在采用这种方法之后，你就能知道，自己正在做（或没有做）的哪些事情会让你的长处无法发挥出来。同时，你也将看到自己在哪些方面能力不是特别强。最后，你还将了解到自己在哪些方面完全不擅长，做不出成绩来。 </p>
<p>根据回馈分析的启示，你需要在几方面采取行动。首先最重要的是，专注于你的长处，把自己放到那些能发挥长处的地方。 </p>
<p>其次，加强你的长处。回馈分析会迅速地显示，你在哪些方面需要改善自己的技能或学习新技能。它还将显示你在知识上的差距——这些差距通常都可以弥补。数学家是天生的，但是人人都能学习三角学。 </p>
<p>第三，发现任何由于恃才傲物而造成的偏见和无知，并且加以克服。有太多的人，尤其是那些术业有专攻的人，往往对其他领域的知识不屑一顾，或者认为聪明的头脑就可取代知识。比如，很多一流的工程师遇上与人相关的事就束手无策，他们还以此为荣——因为他们觉得，对条理清晰的工程师头脑来说，人太混乱无序了。与此形成鲜明对照的是，人力资源方面的专业人员常常以他们连基本的会计知识或数量分析都一无所知而自傲。不过，人们要是对这样的无知还沾沾自喜的话，那无异于自取灭亡。其实，要让自己的长处得到充分发挥，你就应该努力学习新技能、汲取新知识。 </p>
<p>另外一点也同样重要——纠正你的不良习惯。所谓不良习惯，是指那些会影响你的工作成效和工作表现的事情。这样的习惯能很快地在回馈中反映出来。例如，一位企划人员可能发现自己美妙的计划最终落空，原因是他没有把计划贯彻到底。同那些才华横溢的人一样，他也相信好的创意能够移动大山。但是，真正移山的是推土机，创意只不过是为推土机指引方向，让它知道该到何处掘土。这位企划人员必须意识到不是计划做好就大功告成，接下来还得找人执行计划，并向他们解释计划，在付诸行动前须做出及时的调整和修改，最后要决定何时中止计划。 </p>
<p>与此同时，回馈还会反映出哪些问题是由缺乏礼貌造成的。礼貌是一个组织的润滑剂。两个移动物相互接触时发生摩擦是一个自然规律，不仅无生命的物体是这样，人类也是如此。礼貌，其实也很简单，无非是说声“请”和“谢谢”，记住别人的名字，或问候对方家人这样的小事，但就是这种不起眼的细节，使得两个人能够融洽相处，不管他们彼此之间是否有好感。许多聪明人，尤其是聪明的年轻人，没有意识到这一点。如果回馈分析表明某个人只要一遇到需要别人合作的事就屡屡失败，那么很可能就意味着这个人的举止不大得体——也就是缺乏礼貌。 </p>
<p>把预期和实际结果进行比较，也会发现自己不能做什么。我们每个人都有许多一窍不通、毫无天分的领域，在这些领域我们甚至连平庸的水平都达不到。人们，尤其是知识工作者，就不应该试图去完成这些领域的工作和任务。他们应该尽量少把精力浪费在那些不能胜任的领域上，因为从无能到平庸要比从一流到卓越需要人们付出多得多的努力。然而，大多数人，尤其是教师，还有组织，都一门心思要把能力低下的人变成合格者。其实，他们还不如把精力、资源和时间花在将称职者培养成佼佼者上。 </p>
<p>【我的工作方式是怎样的】</p>
<p>令人惊讶的是，很少有人知道自己平时是怎样把事情给做成的。实际上，我们当中的大多数人甚至不知道不同人有着不同的工作方式和表现。许多人不是以他们习惯的方式工作，这当然就容易造成无所作为。对于知识工作者来说，“我的工作方式是怎样的？”可能比“我的长处是什么？”这个问题更加重要。 </p>
<p>同一个人的长处一样，一个人的工作方式也是独一无二的。这由人的个性决定。不管个性是先天决定的，还是后天培养的，它肯定是早在一个人进入职场前就形成了。正如一个人擅长什么、不擅长什么是既定的一样，一个人的工作方式也基本固定，它可以略微有所调整，但是不可能完全改变——当然也不会轻易改变。而且就像人们从事自己最拿手的工作容易做出成绩一样，他们要是采取了自己最擅长的工作方式也容易取得成就。通常，几个常见的个性特征就决定了一个人的工作方式。 </p>
<p>我属于读者型，还是听者型？首先，你要搞清楚的是，你是读者型（习惯阅读信息）还是听者型（习惯听取信息）的人。绝大多数人甚至都不知道还有读者型和听者型之说，而且很少有人既是读者型又是听者型。知道自己属于哪种类型的人更少。但是，有一些例子说明了这样的无知可能造成多大的危害。 </p>
<p>德怀特·艾森豪威尔担任欧洲盟军最高统帅时，一直是新闻媒体的宠儿。他的记者招待会以其独特的风格出名——不管记者提出什么问题，艾森豪威尔将军都从容地对答如流。无论是介绍情况，还是解释政策，他都能够用两三句言简意赅的话就说清楚。十年后，艾森豪威尔当上了总统，当年曾对他十分崇拜的同一批记者，这时却公开瞧不起他。他们抱怨说，他从不正面回答问题，而是喋喋不休地胡侃着其他事情。他们总是嘲笑他回答问题时语无伦次，不合乎语法，糟蹋标准英语。 </p>
<p>艾森豪威尔显然不知道自己属于读者型，而不是听者型。当他担任欧洲盟军最高统帅时，他的助手设法确保媒体提出的每一个问题至少在记者招待会开始前半小时以书面形式提交。这样，艾森豪威尔就完全掌握了记者提出的问题。而当他就任总统时，他的两个前任都是听者型——富兰克林·罗斯福和哈里·杜鲁门。这两位总统知道自己是听者型的，并且都喜欢举行畅所欲言的记者招待会。艾森豪威尔可能认为他必须去做两位前任所做的事。可是，他甚至连记者们在问些什么都从来没听清楚过。而且，艾森豪威尔并不是个极端的例子。 </p>
<p>几年后，林登·约翰逊把自己的总统职位给搞砸了，这在很大程度上是因为他不知道自己是听者型的人。他的前任约翰·肯尼迪是个读者型的人，他搜罗了一些出色的笔杆子当他的助手，要求他们每次进行当面讨论之前务必先给他写通报。约翰逊留下了这些人，他们则继续写通报。可是他显然根本看不懂他们写的东西。不过，约翰逊以前当参议员时曾经表现非凡，因为议员首先必须是听者型。 </p>
<p>没有几个听者型的人可以通过努力变成合格的读者型——不管是主动还是被动的努力，反之亦然。因此，试图从听者型转为读者型的人会遭受林登·约翰逊的命运，而试图从读者型转为听者型的人会遭受德怀特·艾森豪威尔的命运。他们都不可能发挥才干或取得成就。 </p>
<p>【我如何学习】 </p>
<p>要了解一个人的工作方式，需要弄清的第二点是，他是如何学习的。许多一流的笔杆子都不是好学生——温斯顿·邱吉尔就是一例。在他们的记忆中，上学往往是十足的折磨。然而，他们的同学有这种记忆的却很少。他们可能在学校里得不到什么乐趣，对他们来说上学的最大痛苦是无聊。有关这个问题的解释是，笔头好的人一般不靠听和读来学习，而靠写来学习，这已成了一种规律。学校不让他们以这种方式学习，所以他们的成绩总是很糟糕。 </p>
<p>所有的学校都遵循这样的办学思路：只有一种正确的学习方式，而且人人都得遵从。但是，对学习方式跟别人不大一样的学生来说，被迫按学校教的方式来学习就是地狱。实际上，学习大概有六七种不同的方式。 </p>
<p>像邱吉尔这样的人靠写来学习。还有些人以详尽的笔记来学习。例如，贝多芬留下了许多随笔小抄，然而他说，实际上他作曲时从来不看这些随笔小抄。当被问及他为什么还要用笔记下来时，据说他回答道：“如果我不马上写下来的话，我很快就会忘得一干二净。如果我把它们写到小本子上，我就永远不会忘记了，也用不着再看一眼。”有些人在实干中学习。另一些人通过听自己讲话学习。 </p>
<p>我认识一位公司总经理，他把一个平庸的小家族企业发展成行业领军企业。他是一个通过讲话学习的人。他习惯于每周一次把全体高层管理人员召集到他的办公室，随后对他们讲上两三个小时。他总是提出政策性问题，在每一个问题上提出三种不同观点。但他很少请这帮同事发表意见或提出问题，他只需要听众听他讲话。这就是他的学习方式。虽然他是一个比较极端的例子，但是通过讲话学习绝不是一种少见的方法。成功的出庭律师也以同样的方式学习，许多诊断医师也是如此（我自己也是这样）。 </p>
<p>在所有最重要的自我认识当中，最容易做到的就是知道自己是怎样学习的。当我问人们：“你怎么学习？”大多数人都知道答案。但是，当我问：“你根据这个认识来调整自己的行为吗？”没有几个人回答“是”。然而，知行合一是取得成就的关键；如果知行不合一，人们就会无所作为。 </p>
<p>我属于读者型还是听者型？我如何学习？这是你首先要问自己的问题。但是，光这些问题显然不够。要想做好自我管理，你还需要问这样的问题：我能与别人合作得好吗？还是喜欢单枪匹马？如果你确实有与别人进行合作的能力，你还得问问这个问题：我在怎样的关系下与他人共事？ </p>
<p>有些人最适合当部属。二战时期美国的大英雄乔治·巴顿将军是一个很好的例子。巴顿是美军的一名高级将领。然而，当有人提议他担任独立指挥官时，美国陆军参谋长、可能也是美国历史上最成功的伯乐，乔治·马歇尔将军说：“巴顿是美国陆军造就的最优秀的部下，但是，他会成为最差劲的司令官。” </p>
<p>一些人作为团队成员工作最出色。另一些人单独工作最出色。一些人当教练和导师特别有天赋，另一些人却没能力做导师。 </p>
<p>另一个关键的问题是，我如何才能取得成果——是作为决策者还是作为顾问？许多人做顾问时的表现会很出色，但是不能够承担决策的负担和压力。与此相反，也有许多人需要顾问来迫使他们思考，随后他们才能做出决定，接着迅速、自信和大胆地执行决定。 </p>
<p>顺便说一下，一个组织的二号人物在提升到一号职位时常常失败，也正是因为这个原因。最高职位需要一个决策者，而一个强势的决策者常常把其信赖的人放在二号位置，当他的顾问。顾问在二号位置上往往是很出色的，但是换到一号位置，他就不行了。他虽然知道应该做出什么样的决定，但是不能接受真正做决定的责任。 </p>
<p>其他有助于认识自我的重要问题包括：我是在压力下表现出色，还是适应一种按部就班、可预测的工作环境？我是在一个大公司还是在一个小公司中工作表现最佳？在各种环境下都工作出色的人寥寥无几。我不止一次地看到有些人在大公司中十分成功，换到小公司中则很不顺利。反过来也是如此。 </p>
<p>下面这个结论值得我们反复强调：不要试图改变自我，因为这样你不大可能成功。但是，你应该努力改进你的工作方式。另外，不要从事你干不了或干不好的工作。 </p>
<p>【我的价值观是什么】</p>
<p>要能够自我管理，你最后不得不问的问题是：我的价值观是什么？这不是一个有关伦理道德的问题。道德准则对每一个人都一样。要对一个人的道德进行测试，方法很简单。我把它称为“镜子测试”。 </p>
<p>20世纪初，德国驻英国大使是当时在伦敦所有大国中最受尊重的一位外交官。显然，他命中注定会承担重任，即使不当本国的总理，至少也要当外交部长。然而，在1906年，他突然辞职，不愿主持外交使团为英国国王爱德华七世举行的晚宴。这位国王是一个臭名昭著的色鬼，并且明确表示他想出席什么样的晚宴。据有关报道，这位德国大使曾说：“我不想早晨刮脸时在镜子里看到一个皮条客。” </p>
<p>这就是镜子测试。我们所尊从的伦理道德要求你问自己：我每天早晨在镜子里想看到一个什么样的人？在一个组织或一种情形下合乎道德的行为，在另一个组织或另一种情形下也是合乎道德的。但是，道德只是价值体系的一部分——尤其对于一个组织的价值体系来说。 </p>
<p>如果一个组织的价值体系不为自己所接受或者与自己的价值观不相容，人们就会备感沮丧，工作效力低下。 </p>
<p>让我们来看看一位十分成功的人力资源主管的经历。这位主管所在的公司被一家大企业收购。收购之后，她得到了提升，从事的是她以前做得最出色的工作，包括为重要职位挑选人才。这位主管深信，在选人时，公司只有在排除内部的所有可能人选后才能从外部招聘人才。但是她的新公司认为应该首先从外部招聘，以吸收新鲜血液。对于这两种方式，需要说明的一点是，根据我的经验，适当的方式是两者兼顾。然而，这两种方式在根本上是互不相容的——表面上是政策不同，实质是价值观的不同。这说明在该公司人们对以下三个问题有着不同看法：组织与员工之间是怎样的关系；组织应该为员工以及员工的发展承担何种责任；一个人对企业最重要的贡献是什么。经过几年挫折，这位主管最终辞职——尽管她的经济损失很大。她的价值观和这个组织的价值观就是无法融合。 </p>
<p>同样，一家制药公司无论是通过不断的小幅改进，还是通过几次费用高昂、风险巨大的“突破”来取得出色业绩，都主要不是一个经济问题。这两种战略的结果可能都差不多。实质上，这是两种价值体系之间的冲突。一种价值体系认为公司的贡献是帮助医生把他们已经在做的工作锦上添花，另一种价值体系的取向是进行更多的科学发现。 </p>
<p>至于一个企业的经营是着眼于短期结果，还是注重长远发展，这同样是价值观问题。财务分析师认为，企业可两者同时兼顾。成功的企业家知道得更清楚。诚然，每一家公司都必须取得短期成果。但是在短期成果与长期增长之间的冲突中，每一家公司都将决定自己所选择的重点。从根本上说，这是一种关于企业职能与管理层责任的价值观冲突。 </p>
<p>价值观冲突并不限于商业组织。美国发展最快的一个牧师教会，衡量工作成败的尺度是新教徒的人数。它的领导层认为，重要的是有多少新教徒入会。随后，上帝将满足他们的精神需求，或者至少会满足足够比例的新教徒的需求。另一个福音派牧师教会认为，重要的是人们的精神成长。这个教会慢慢地让那些形式上入会但精神上并没有融入教会生活的新教徒选择了离开。 </p>
<p>这同样不是一个数量问题。乍一看，第二个教会好像发展较慢。但是，它留住新教徒的比例要远高于第一个。换言之，它的发展比较稳固。这也不是一个神学问题，至少首先并不是神学问题，而是有关价值观的问题。在一次公开辩论中，一位牧师这样说：“除非你先加入教会，否则你永远找不到天国之门。” </p>
<p>而另一位牧师反驳说：“不，除非你先有心寻找天国之门，否则你就不属于教会。” </p>
<p>组织和人一样，也有价值观。为了在组织中取得成效，个人的价值观必须与这个组织的价值观相容。两者的价值观不一定要相同，但是必须相近到足以共存。不然，这个人在组织中不仅会感到沮丧，而且做不出成绩。 </p>
<p>一个人的工作方式和他的长处很少发生冲突，相反，两者能产生互补。但是，一个人的价值观有时会与他的长处发生冲突。一个人做得好甚至可以说是相当好、相当成功的事情——可能与其价值体系不吻合。在这种情况下，这个人所做的工作似乎并不值得贡献毕生的精力（甚至没必要贡献太多的精力）。 </p>
<p>如果可以，请允许我插入一段个人的故事。多年前，我也曾不得不在自己的价值观和做得很成功的工作之间做出选择。20世纪30年代中期，我还是一个年轻人，在伦敦做投资银行业务，工作非常出色。这项工作显然能发挥我的长处。然而，我并不认为自己担任资产管理人是在做贡献。我认识到，我所重视的是对人的研究。我认为，一生忙于赚钱、死了成为墓地中的最大富翁没有任何意义。当时我没有钱，也没有任何就业前景。尽管当时大萧条仍在持续，我还是辞去了工作。这是一个正确的选择。换言之，价值观是并且应该是最终的试金石。 </p>
<p>【我属于何处】</p>
<p>少数人很早就知道他们属于何处。比如，数学家、音乐家和厨师，通常在四五岁的时候就知道自己会成为数学家、音乐家和厨师了。物理学家通常在十几岁甚至更早的时候就决定了自己的工作生涯。但是，大多数人，尤其是很有天赋的人，至少要过了二十五六岁才知道他们将身属何处。然而，到这个时候，他们应该知道上面所谈的三个问题的答案：我的长处是什么？我的工作方式是怎样的？我的价值观是什么？随后，他们就能够并且应该决定自己该向何处投入精力。 </p>
<p>或者，他们应该能够决定自己不属于何处。已经知道自己在大公司里干不好的人，应该学会拒绝在一个大公司中任职。已经知道自己不适合担任决策者的人，应该学会拒绝做决策工作。巴顿将军（他自己大概永远不知道这一点）本来应该学会拒绝担任独立总指挥的。 </p>
<p>同样重要的是，知道上述三个问题的答案，也使得一个人能够坦然接受一个机会、一个邀请或一项任务。“是的，我将做这件事。但是，我将按照我自己的特点，采取这样的方式来做这件事，进行这样的组织安排，这样来处理当中所牵涉的关系。这是我在这个时间范围内应该会取得的成果，因为这就是我。” </p>
<p>成功的事业不是预先规划的，而是在人们知道了自己的长处、工作方式和价值观后，准备把握机遇时水到渠成的。知道自己属于何处，可使一个勤奋、有能力但原本表现平平的普通人，变成出类拔萃的工作者。 </p>
<p>【我该做出什么贡献】</p>
<p>综观人类的发展史，绝大多数人永远都不需要提出这样一个问题：我该做出什么贡献？因为他们该做出什么贡献是由别人告知的，他们的任务或是由工作本身决定的（例如农民或工匠的任务），或是由主人决定的（例如佣人的任务）。以前的人大多都处于从属地位，别人吩咐他们做什么，就做什么，这被认为是理所当然的。甚至到了20世纪50年代和60年代，那时涌现出的知识工作者（即所谓的“组织人”， organization man）还指望公司的人事部为他们做职业规划。 </p>
<p>随后，到20世纪60年代末，就再没有人想让别人来安排自己的职业生涯了。年轻的男男女女开始提出这个问题：我想做什么？而他们所听到的答案就是“你们自行其是吧”。但是，这种回答同“组织人”听命公司的做法一样错误。那些相信自行其是就能做出贡献、实现抱负、取得成功的人，一般连三点中的任何一点都做不到。 </p>
<p>尽管如此，我们还是不能走回头路，让别人来吩咐、安排自己要干什么。对于知识工作者来说，他们还不得不提出一个以前从来没有提出过的问题：我的贡献应该是什么？要回答这个问题，他们必须考虑三个不同的因素：当前形势的要求是什么？鉴于我的长处、我的工作方式以及我的价值观，我怎样才能对需要完成的任务做出最大贡献？最后，必须取得什么结果才能产生重要影响？ </p>
<p>请看一位新任命的医院院长的经历。这是一所享有盛名的大医院，30年来一直就靠名气顺利经营着。新院长上任后决定了自己应做的贡献：两年内在医院的某个重要领域建立起卓越服务的标准。他决定以急诊室为重点，因为该院的急诊室地方比较大，受人注意，而又秩序混乱。他决定，到急诊室就诊的每一个患者必须在60秒钟之内由一名合格的护士接待。一年之内，该医院的急诊室变成了美国所有医院的样板，又过了两年，整个医院的面貌焕然一新。 </p>
<p>正如这个事例所表明的，把眼光放得太远是不大可能的——甚至不是特别有效。一般来说，一项计划的时间跨度如果超过了 18个月，就很难做到明确和具体。因此，在多数情况下我们应该提出的问题是：我在哪些方面能取得将在今后一年半内见效的结果？如何取得这样的结果？回答这个问题时必须对几个方面进行权衡。首先，这些结果应该是比较难实现的——用当前的一个时髦词说，就是要有“张力” （stretching）。但是，这些结果也应该是能力所及的。设定一个不能实现的目标或者只能在可能性微乎其微的情况下实现的目标，根本不能叫雄心勃勃，简直就是愚蠢。其次，这些结果应该富有意义，要能够产生一定影响。最后，结果应该明显可见，如果可能的话，还应当能够衡量。确定了要实现的结果之后，接着就可以制订行动方针：做什么，从何处着手，如何开始，目标是什么，在多长时间内完成。 </p>
<p>【对人际关系负责】</p>
<p>除了少数伟大的艺术家、科学家和运动员，很少有人是靠自己单枪匹马而取得成果的。不管是组织成员还是个体职业者，大多数人都要与别人进行合作，并且是有效的合作。要实现自我管理，你需要对自己的人际关系负起责任。这包括两部分内容。 </p>
<p>首先是要接受别人是和你一样的个体这个事实。他们会执意展现自己作为人的个性。这就是说，他们也有自己的长处，自己的做事方式和自己的价值观。因此，要想卓有成效，你就必须知道共事者的长处、工作方式和价值观。这个道理听起来让人很容易明白，但是没有几个人真正会去注意。一个习惯于写报告的人就是个典型的例子——他在第一份工作时就培养起写报告的习惯，因为他的老板是一个读者型的人，而即使下一个老板是个听者型，此人也会继续写着那肯定没有任何结果的报告。这位老板因此肯定会认为这个员工愚蠢、无能、懒惰，肯定干不好工作。但是，如果这个员工事先研究过新老板的情况，并分析过这位老板的工作方式，这种情况本来可以避免。 </p>
<p>老板既不是组织结构图上的一个头衔，也不是一个“职能”。他们是有个性的人，他们有权以自己最得心应手的方式来工作。与他们共事的人有责任观察他们，了解他们的工作方式，并做出相应的自我调整，去适应老板最有效的工作方式。事实上，这就是“管理”上司的秘诀。 </p>
<p>这种方法适用于所有与你共事的人。每个人都有他自己的做事方法，也有权按照自己的方式来工作，而不是按你的方法来工作。重要的是，他们能否有所作为以及他们持有什么样的价值观。至于工作方式，人各有别。提高效力的第一个秘诀是了解跟你合作和你要依赖的人，以利用他们的长处、工作方式和价值观。工作关系应当既以工作为基础，也以人为基础。 </p>
<p>人际关系责任的第二部分内容是沟通责任。在我或是其他人开始给一个组织做咨询时，我们听到的第一件事都与个性冲突有关。其中大部分冲突都是因为：人们不知道别人在做什么，他们又是采取怎样的工作方式，专注于做出什么样的贡献以及期望得到怎样的结果。而这些人不了解情况的原因是，他们没有去问，结果也就不得而知。 </p>
<p>这种不去问明情况的做法，与其说是反映了人类的愚蠢，倒不如说是历史使然。在以前，人们没必要把这些情况告诉任何人。比如在中世纪的城市，一个区的每一个人从事的行业都一样。在乡村，土地刚一解冻，山谷里的每一个人就开始播种同一种农作物。即使有少数人做的事情和大家不一样，他们也是单独工作，因此不需要告诉任何人他们在做什么。 </p>
<p>而现在，大多数人都与承担着不同任务和责任的人一道工作。市场营销副总裁可能是销售出身，知道有关销售的一切，但是，对于自己从未做过的事情，比如定价、广告、包装等等，就一无所知了。所以，那些正在做这些工作的人必须确保营销副总裁懂得他们设法做的是什么、他们为什么要做这件事、他们将如何去做以及期望取得什么结果。 </p>
<p>如果营销副总裁不懂得这些高层次的、知识型的专业人士在做什么，错主要在后者身上，而不在自己。反过来说，营销副总裁的责任则是确保他的所有同事都知道自己是怎样看待营销这项工作的：他的目标是什么、他如何工作，以及他对他本人和他的每一个同事有什么期望。 </p>
<p>即使一些人懂得负起人际关系责任的重要性，他们和同事的交流也往往不够。他们总是有所顾虑，怕别人把自己看成是一个冒昧、愚蠢、爱打听的人。他们错了。因为我们看到，每当有人找到他的同事说“这是我所擅长的工作。这是我的做事方式。这是我的价值观。这是我计划做出的贡献和应当取得的成果”，这个人总会得到如此回答：“这太有帮助了，可你为什么不早点告诉我？” </p>
<p>如果一个人继续问道：“那么，关于你的长处、你的工作方式、你的价值观以及你计划做出的贡献，我需要知道什么？”他也会得到类似的答复——据我的经验，无一例外。事实上，知识工作者应该向与他们共事的每一个人，不管是下属、上司、同事还是团队成员，都发出这样的疑问。而且，每次提出此类问题，都会得到这样的回答：“谢谢你来问我。但是，你为什么不早点问我？” </p>
<p>组织已不再建立在强权的基础上，而是建立在信任的基础上。人与人之间相互信任，不一定意味着他们彼此喜欢对方，而是意味着彼此了解。因此，人们绝对有必要对自己的人际关系负责。这是一种义务。不管一个人是公司的一名成员，还是公司的顾问、供应商或经销商，他都需要对他的所有共事者负起这种责任。所谓共事者，是指在工作上他所依赖的同事以及依赖他的同事。 </p>
<p>【管理后半生】 </p>
<p>当多数人的工作是体力劳动时，你不必为自己的后半生担心。你只要继续从事你一直在做的工作就行了。如果你够幸运，能在工厂或铁路辛勤工作40年后撑下来，你就可以快乐地度过余生，什么也用不着干。然而，现在的多数工作都是知识工作，而知识工作者在干了40年后，仍能发挥余热，他们只是有些厌倦。 </p>
<p>我们听到了许多有关经理人中年危机的谈论，“厌倦”这个词在其中频频出现。45岁时，多数经理人的职业生涯达到了顶峰，他们也知道这一点。在做了 20年完全相同的工作之后，他们已经得心应手。但是他们学不到新东西，也没有什么新贡献，从工作中得不到挑战，因而也谈不上满足感。然而，在他们面前，还有20到25年的职业道路要走。这就是为什么经理人在进行自我管理后，越来越多地开始发展第二职业的原因。 </p>
<p>发展第二职业有三种方式。第一种是完全投身于新工作。这常常只需要从一种组织转到另一种组织。例如，一家大公司某事业部的会计师成为一家中型医院的财务总监。但是也有越来越多的人转入完全不同的职业。例如，公司经理在45岁时进入政府内阁；或者中层管理人员在公司工作20年后离职，到法学院进修，成为一个小镇的律师。 </p>
<p>还有许多人在第一份职业中取得的成功有限，于是改行从事第二职业。这样的人有很多技能，他们也知道该如何工作。而且，他们需要一个社群——因为孩子已长大单飞，剩下一座空屋。他们也需要收入。但最重要的是，他们需要挑战。 </p>
<p>为后半生做准备的第二种方式是，发展一个平行的职业。许多人的第一职业十分成功，他们还会继续从事原有工作，或全职或兼职，甚至只是当顾问。但是，除此之外，他们会开创一项平行的工作，通常是在非营利机构，每周占用10个小时。例如，他们可能接手教会的管理，或者担任当地女童子军顾问委员会主席。他们也可能管理受虐妇女庇护所，担任当地公共图书馆的儿童图书管理员，或在学校董事会任职等。 </p>
<p>最后一种方法是社会创业。社会创业者通常是在第一职业中非常成功的人士。他们都热爱自己的工作，但是这种工作对他们已经不再有挑战性。在许多情况下，他们虽然继续做着原来的工作，但在这份工作上花的时间越来越少。他们同时开创了另一项事业，通常是非营利性活动。例如，我的朋友鲍勃·布福德创办了一个非常成功的电视公司，现在他仍然经营着。但与此同时，他还创建了一个与新教教会合作的非营利组织，也做得非常成功。现在他又创建了一个组织，专门指导社会创业者在经营原有业务的同时，如何管理自己另外创办的非营利机构。 </p>
<p>管理好自己后半生的人可能总是少数。多数人可能“一干到底”，数着年头一年一年过去，直至退休。但是，正是这些少数人，这些把漫长的工作寿命看做是自己和社会之机会的男男女女，才会成为领袖和模范。 </p>
<p>在一个崇尚成功的社会里，拥有各种选择变得越来越重要。从历史上来看，却没有“成功”一说。绝大多数人只期望坚守“适当的位置”。唯一的流动性是向下的流动性。然而，在知识社会里，我们期望每一个人都能取得成功。这显然是不可能的。对许多人来说，能避免失败就行。可是有成功的地方，就会有失败。因此，有一个能够让人们做出贡献、发挥影响力或成为“大人物”的领域，这不仅对个人十分重要，对个人的家庭也同样重要。这意味着人们需要找到一个能够有机会成为领袖、受到尊重、取得成功的第二领域——可能是第二份职业，也可能是平行的职业或社会创业。 </p>
<p>自我管理中面临的挑战看上去比较明显，甚至非常基本，其答案可能不言自明，甚至近乎幼稚。但是，自我管理需要个人，尤其是知识工作者，做出以前从未做过的事情。实际上，自我管理需要每一个知识工作者在思想和行动上都要成为自己的首席执行官。更进一步来看，这样的转变——从一切听从别人吩咐的体力劳动者到不得不自我管理的知识工作者——也使得社会结构发生了深刻变化。历史上每一个社会，甚至是个人主义倾向最强的社会，都认为两件事情理所当然（即使只是下意识的）：第一，组织比员工更长寿；第二，大多数人从不挪地方。 </p>
<p>如今，情况恰恰相反。知识工作者的寿命超过了组织寿命，而且他们来去自如。于是，人们对自我管理的需要在人类事务中掀起了一场革命。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.raoxia.com/%e7%ae%a1%e7%90%86%e8%87%aa%e5%b7%b1%ef%bc%8c%e4%b8%80%e8%be%88%e5%ad%90%e7%9a%84%e8%81%8c%e5%9c%ba-7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JS中的构造函数解析</title>
		<link>http://www.raoxia.com/%e7%94%b5%e5%bd%b1%e4%b8%ad%e9%82%a3%e4%ba%9b%e7%bb%8f%e5%85%b8%e7%88%b1%e6%83%85%e8%af%ad%e5%8f%a5%ef%bc%88%e4%b8%ad%e8%8b%b1%e5%8f%8c%e8%af%ad%ef%bc%89-3/</link>
		<comments>http://www.raoxia.com/%e7%94%b5%e5%bd%b1%e4%b8%ad%e9%82%a3%e4%ba%9b%e7%bb%8f%e5%85%b8%e7%88%b1%e6%83%85%e8%af%ad%e5%8f%a5%ef%bc%88%e4%b8%ad%e8%8b%b1%e5%8f%8c%e8%af%ad%ef%bc%89-3/#respond</comments>
		<pubDate>Sun, 13 Jul 2014 03:45:46 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.raoxia.com/?p=373</guid>
		<description><![CDATA[在JavaScript中，任何合法的函数都可以作为对象的构造函数，这既包括系统内置函数，也包括用户自己定义的函数。一旦函数被作为构造函数执行，它内部的this属性将引用函数本身。

通常来说，构造函数没有返回值，它们只是初始化由this指针传递进来的对象，并且什么也不返回。如果一个函数有返回值，被返回的对象就成了new表达式的值。从形式上看，一个函数被作为构造函数还是普通函数执行的唯一区别，是否用new运算符。

&#160;

上面的描述事实上有着更为精确的含义，这要把函数如果有返回值的情况分为函数的返回值是引用类型和值类型两种情况。

&#160;

如果一个函数的返回值是引用类型（数组，对象或者函数）的数据，那么这个函数作为构造函数用new运算符执行构造时，运算的结果将被它的返回值取代，这时候，构造函数体内的this值丢失了，取而代之的是被返回的对象。例如：

function test()

{

this.a=10;

return function()

{

return 1;

}

}

alert m=new test();

var n=test();

alert(m);//返回return后面的闭包

alert(n);//返回return 后面的闭包

运行结果m的值和n的值是一样的，都是test函数返回的闭包，而this引用的对象和this.a=10的赋值结果全部被丢弃。

&#160;

如果一个函数的返回值是一个值类型，那么这个函数作为构造函数用new运算符执行构造时，它的返回值将被丢弃。new 表达式的结果仍然是this所引用的对象。

function test()

{

this.a=10;

return 1;

}

alert m=new test();

var n=test();

alert(m)//返回【Object】

alert(n)//返回1]]></description>
				<content:encoded><![CDATA[<p>在JavaScript中，任何合法的函数都可以作为对象的构造函数，这既包括系统内置函数，也包括用户自己定义的函数。一旦函数被作为构造函数执行，它内部的this属性将引用函数本身。</p>
<p>通常来说，构造函数没有返回值，它们只是初始化由this指针传递进来的对象，并且什么也不返回。如果一个函数有返回值，被返回的对象就成了new表达式的值。从形式上看，一个函数被作为构造函数还是普通函数执行的唯一区别，是否用new运算符。</p>
<p>&nbsp;</p>
<p>上面的描述事实上有着更为精确的含义，这要把函数如果有返回值的情况分为函数的返回值是引用类型和值类型两种情况。</p>
<p>&nbsp;</p>
<p>如果一个函数的返回值是引用类型（数组，对象或者函数）的数据，那么这个函数作为构造函数用new运算符执行构造时，运算的结果将被它的返回值取代，这时候，构造函数体内的this值丢失了，取而代之的是被返回的对象。例如：</p>
<p>function test()</p>
<p>{</p>
<p>this.a=10;</p>
<p>return function()</p>
<p>{</p>
<p>return 1;</p>
<p>}</p>
<p>}</p>
<p>alert m=new test();</p>
<p>var n=test();</p>
<p>alert(m);//返回return后面的闭包</p>
<p>alert(n);//返回return 后面的闭包</p>
<p>运行结果m的值和n的值是一样的，都是test函数返回的闭包，而this引用的对象和this.a=10的赋值结果全部被丢弃。</p>
<p>&nbsp;</p>
<p>如果一个函数的返回值是一个值类型，那么这个函数作为构造函数用new运算符执行构造时，它的返回值将被丢弃。new 表达式的结果仍然是this所引用的对象。</p>
<p>function test()</p>
<p>{</p>
<p>this.a=10;</p>
<p>return 1;</p>
<p>}</p>
<p>alert m=new test();</p>
<p>var n=test();</p>
<p>alert(m)//返回【Object】</p>
<p>alert(n)//返回1</p>
]]></content:encoded>
			<wfw:commentRss>http://www.raoxia.com/%e7%94%b5%e5%bd%b1%e4%b8%ad%e9%82%a3%e4%ba%9b%e7%bb%8f%e5%85%b8%e7%88%b1%e6%83%85%e8%af%ad%e5%8f%a5%ef%bc%88%e4%b8%ad%e8%8b%b1%e5%8f%8c%e8%af%ad%ef%bc%89-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JS中继承机制的实现</title>
		<link>http://www.raoxia.com/%e8%b6%85%e7%ba%a7%e8%ae%a1%e7%ae%97%e6%9c%ba%e8%bf%98%e6%98%af%e8%b6%85%e7%ba%a7%e7%83%82%e5%b0%be%ef%bc%9f/</link>
		<comments>http://www.raoxia.com/%e8%b6%85%e7%ba%a7%e8%ae%a1%e7%ae%97%e6%9c%ba%e8%bf%98%e6%98%af%e8%b6%85%e7%ba%a7%e7%83%82%e5%b0%be%ef%bc%9f/#respond</comments>
		<pubDate>Sun, 13 Jul 2014 03:27:59 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.raoxia.com/?p=367</guid>
		<description><![CDATA[JS中实现实现继承的机制不止一种，这是因为JS中的继承机制并不是明确规定的，而是通过模仿实现的。这意味着所有的继承细节并非完全由解释程序处理。作为开发者，我们有权决定最适用的继承方式。

&#160;

1.构造继承法。

构造继承法是使用了FUNCTION对象的call和apply方法。call的第一个参数用作this的对象，其余的参数是传给函数的参数。示例代码如下

function classA(sColor)

{

this.color=sColor;

this.sayColor=function()

{

alert(this.color);

}

}

function classB(sColor,sName)

{

classA.call(this,sColor);

this.name=sName;

this.sayName=function()

{

alert(this.name);

}

}

这样，classB内部先调用了classA的构造函数，将该构造函数的的啊用对象设置成classB的对象，从而实现了对classA的继承.而apply的用法基本上和call相同，唯一的不同点是apply方法只有两个参数，第一个参数是用作this的对象，第二个参数是要传给构造函数的参数数组。要注意，用prototype对象定义的属性和方法是不能用这种方法继承的。

&#160;

2.原型链

我们知道,prototype对象是个模版，要实例化的对象都会以这模板作为基础。总而言之，prototype对象的任何属性和方法都被传递给那个类的所有实例。原型链正是利用这种功能来实现继承机制。

function classA()

{

}

classA.prototype.color="red";

classA.prototype.sayColor=function()

{

alert(this.color);

}

&#160;

function ClassB()

{

}

ClassB.prototype=new ClassA();

ClassB.prototype.name="";

ClassB.prototype.sayName=function()

{

alert(this.name);

}

因为任何一个类只能有一个原型对象，所以原型链的弊端是不支持多重继承。而且，原型链会用另一类型的对象重写类的prototype属性。

&#160;

3.混合方式

这种方式的思想是使用构造继承法继承属性，而用原型链继承法继承方法

function ClassA(sColor)

{

this.color=sColo;

}

ClassA.prototype.sayColor=function()

{

alert(this.color);

}

function ClassB(sColor,sName)

{

ClassA.call(this,sColor);

this.name=sName;

}

ClassB.prototype=new ClassA();

ClassB.prototype.sayName=function()

{

alert(this.name);

}

&#160;

最后要注意的是用动态原型方法实现继承是不行的。。因为它会先创造对象实例，然后修改原型。这样会使第一个被创造的对象实例无法看到这种改变。但是未来的对象实例可以反映出这种改变。]]></description>
				<content:encoded><![CDATA[<p>JS中实现实现继承的机制不止一种，这是因为JS中的继承机制并不是明确规定的，而是通过模仿实现的。这意味着所有的继承细节并非完全由解释程序处理。作为开发者，我们有权决定最适用的继承方式。</p>
<p>&nbsp;</p>
<p>1.构造继承法。</p>
<p>构造继承法是使用了FUNCTION对象的call和apply方法。call的第一个参数用作this的对象，其余的参数是传给函数的参数。示例代码如下</p>
<p>function classA(sColor)</p>
<p>{</p>
<p>this.color=sColor;</p>
<p>this.sayColor=function()</p>
<p>{</p>
<p>alert(this.color);</p>
<p>}</p>
<p>}</p>
<p>function classB(sColor,sName)</p>
<p>{</p>
<p>classA.call(this,sColor);</p>
<p>this.name=sName;</p>
<p>this.sayName=function()</p>
<p>{</p>
<p>alert(this.name);</p>
<p>}</p>
<p>}</p>
<p>这样，classB内部先调用了classA的构造函数，将该构造函数的的啊用对象设置成classB的对象，从而实现了对classA的继承.而apply的用法基本上和call相同，唯一的不同点是apply方法只有两个参数，第一个参数是用作this的对象，第二个参数是要传给构造函数的参数数组。要注意，用prototype对象定义的属性和方法是不能用这种方法继承的。</p>
<p>&nbsp;</p>
<p>2.原型链</p>
<p>我们知道,prototype对象是个模版，要实例化的对象都会以这模板作为基础。总而言之，prototype对象的任何属性和方法都被传递给那个类的所有实例。原型链正是利用这种功能来实现继承机制。</p>
<p>function classA()</p>
<p>{</p>
<p>}</p>
<p>classA.prototype.color=&#8221;red&#8221;;</p>
<p>classA.prototype.sayColor=function()</p>
<p>{</p>
<p>alert(this.color);</p>
<p>}</p>
<p>&nbsp;</p>
<p>function ClassB()</p>
<p>{</p>
<p>}</p>
<p>ClassB.prototype=new ClassA();</p>
<p>ClassB.prototype.name=&#8221;&#8221;;</p>
<p>ClassB.prototype.sayName=function()</p>
<p>{</p>
<p>alert(this.name);</p>
<p>}</p>
<p>因为任何一个类只能有一个原型对象，所以原型链的弊端是不支持多重继承。而且，原型链会用另一类型的对象重写类的prototype属性。</p>
<p>&nbsp;</p>
<p>3.混合方式</p>
<p>这种方式的思想是使用构造继承法继承属性，而用原型链继承法继承方法</p>
<p>function ClassA(sColor)</p>
<p>{</p>
<p>this.color=sColo;</p>
<p>}</p>
<p>ClassA.prototype.sayColor=function()</p>
<p>{</p>
<p>alert(this.color);</p>
<p>}</p>
<p>function ClassB(sColor,sName)</p>
<p>{</p>
<p>ClassA.call(this,sColor);</p>
<p>this.name=sName;</p>
<p>}</p>
<p>ClassB.prototype=new ClassA();</p>
<p>ClassB.prototype.sayName=function()</p>
<p>{</p>
<p>alert(this.name);</p>
<p>}</p>
<p>&nbsp;</p>
<p>最后要注意的是用动态原型方法实现继承是不行的。。因为它会先创造对象实例，然后修改原型。这样会使第一个被创造的对象实例无法看到这种改变。但是未来的对象实例可以反映出这种改变。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.raoxia.com/%e8%b6%85%e7%ba%a7%e8%ae%a1%e7%ae%97%e6%9c%ba%e8%bf%98%e6%98%af%e8%b6%85%e7%ba%a7%e7%83%82%e5%b0%be%ef%bc%9f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JS中类或对象的定义</title>
		<link>http://www.raoxia.com/%e8%80%81%e5%a4%96%e5%81%9a%e5%b0%8f%e5%ad%a6%e5%a5%a5%e6%95%b0%e7%ab%9e%e8%b5%9b/</link>
		<comments>http://www.raoxia.com/%e8%80%81%e5%a4%96%e5%81%9a%e5%b0%8f%e5%ad%a6%e5%a5%a5%e6%95%b0%e7%ab%9e%e8%b5%9b/#respond</comments>
		<pubDate>Sun, 08 Jun 2014 06:00:49 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.raoxia.com/?p=365</guid>
		<description><![CDATA[我们知道，JS是面向对象的。谈到面向对象，就不可避免的要涉及类的概念。一般像c#，java这些强类型语言都有固定的定义类的语法。而JS的不同之处在于它能使用各种方法实现自己的类和对象。一般的实现有以下几种方式：

&#160;

1.工厂方式

工厂方式是指创建一个返回特定对象类型的工厂函数，示例代码如下：

function createCar(sColor,iDoors,iMpg)

{

var oTempCar=new Object;

oTempCar.color=sColor;

oTempCar.doors=iDoors;

oTempCar.mpg=iMpg;

oTempCar.showColor=function()

{

alert(this.color);

}

return oTempCar;

}

var oCar1=createCar("red",4,23);

var oCar2=createCar("blue",3,25);

oCar1.showColor();

oCar2.showColor();

这种方式每次调用它的工厂函数，都会创建一个新对象。可问题在于每次生成一个新对象，都要创建新函数showColor,这使得每个对象都有自己的showColor版本，而事实上，所有的对象都共享同一个函数.为解决这个问题，开发者在工厂函数的外面定义了对象的方法，然后赋予对象一个指针指向这个这个函数，如下

function showColor()

{

alert(this.color);

}

function createCar(sColor,iDoors,iMpg)

{

var oTempCar=new Object;

oTempCar.color=sColor;

oTempCar.doors=iDoors;

oTempCar.mpg=iMpg;

oTempCar.showColor=showColor;

return oTempCar;

}

var oCar1=createCar("red",4,23);

var oCar2=createCar("blue",3,25);

oCar1.showColor();

oCar2.showColor();

这样就不需要为每一个对象都创建自己的showColor函数，而只是创建指向这个函数的指针.这从功能上解决了问题，但是该函数却不像对象的方法。于是，引出了构造函数的方式。

&#160;

2.构造函数方式

构造函数与工厂函数很相似，示例代码如下：

function Car(sColor,iDoors,iMpg)

{

this.color=sColor;

this.doors=iDoors;

this.mpg=iMpg;

this.showColor=function()

{

alert(this.color);

}

}

var oCar1=new Car("red",4,23);

var oCar2=new Car("blue",3,25);

在构造函数中，内部无创建对象，而是使用this关键字。使用new运算符调用构造函数时，在执行第一行代码之前先创建一个对象，只有用this才能访问这个对象。但是这会遇到什么问题呢，很显然，它的每个对象也都会创建自己的showColor函数版本。为解决这个问题，引出了以下的原型方式.

&#160;

3.原型方式

该方式利用了对象的prototype属性，可把它看成创建新对象所依赖的原型。这里，用空构造函数来设置类名。然后把所有的方法和属性都直接赋予prototype属性。如下:

function Car()

{}

Car.prototype.color="red";

Car.prototype.doors=4;

Car.prototype.mpg=23;

Car.prototype.drivers=new Array("Mike","Sue");

Car.prototype.showColor=function()

{

alert(this.color);

}

原型方式只能直接赋值，而不能通过给构造函数传递参数初始化属性的值。在用这种方式时，会遇到两个问题，不知道大家注意到没有。第一问题是采用这种方式必须创建每个对象后才能改变属性的默认值。而不能在创建每个对象时都会直接有自己所需要的属性值。这点很讨厌。第二个问题在于属性所指的是对象的时候。函数共享不会出现任何问题，但是对象共享却会出现问题。因为每个实例一般都要实现自己的对象。

&#160;

如下面:

var oCar1=new Car();

var oCar2=new Car();

oCar1.drivers.push("Matt");

alert(oCar1.drivers);//输出 "Mike,Sue,Matt"

alert(oCar2.drivers);//输出"Mike,Sue,Matt"

因此drivers属性只是指向对象的指针，所以所有的实例事实上共享同一个对象。由于出现这这些问题，我们引出了下面的联合使用构造函数和原型方式。

&#160;

4.混合的构造函数/原型方式

这种方式的思想是用构造函数定义对象的所有非函数属性（包括普通属性和指向对象的属性），用原型方式定义对象的函数属性（方法）。结果使得所有的函数都只被创建一次，而每个对象都有自己的对象属性实例。示例代码如下：

function Car(sColor,iDoors,iMpg)

{

this.color=sColor;

this.doors=iDoors;

this.mpg=iMpg;

this.drivers=new Array("Mike","Sue");

}

Car.prototype.showColor=function()

{

alert(this.color);

}

var oCar1=new Car("red",4,23);

var oCar2=new Car("blue",3,25);

oCar1.drivers.push("Matt");

alert(oCar1.drivers);//输出 "Mike,Sue,Matt"

alert(oCar2.drivers);//输出 "Mike,Sue"

由实例代码可知，这种方式同时解决了上一种方式的两个问题。不过，采用这种方式，仍有些开发者觉得不够完美。

&#160;

5.动态原型方式

我们可知，大多数面向对象语言都对属性和方法进行了视觉上的封装。而上述方式的showColor方法却定义在了类的外面。因此，他们设计了动态原型方法。这种方式的基本思想和混合的构造函数/原型方式相同，唯一不同之处在于对象方法的位置。如下所示：

function Car(sColor,iDoors,iMpg)

{

this.color=sColor;

this.doors=iDoors;

this.mpg=iMpg;

this.drivers=new Array("Mike","Sue");

if(typeof Car._initialized=="undefined")

{

Car.prototype.showColor=function()

{

alert(this.color);

}

}

Car._initialized=true;

}

这种方式Car.prototype.showColor只被创建一次。这样依赖，这段代码更像其他语言中的类定义了。

&#160;

6.混合工厂方式

这种方式通常是不能应该前一种方式的变通方法。它的目的是创建假构造函数，只返回另一种对象的新实例。

function createCar()

{

var oTempCar=new Object;

oTempCar.color=“red”;

oTempCar.doors=4;

oTempCar.mpg=23;

oTempCar.showColor=function()

{

alert(this.color);

};

return oTempCar;

}

var car=new Car();

由于在Car()构造函数内部调用了new运算符，所以自动忽略第二个new运算符。在构造函数内部创建的对象被传递回变量var。这种方式在对象方法的内部管理方面与经典方式有着相同的问题。所以强烈建议：除非万不得已，还是避免使用这种方式。]]></description>
				<content:encoded><![CDATA[<p>我们知道，JS是面向对象的。谈到面向对象，就不可避免的要涉及类的概念。一般像c#，java这些强类型语言都有固定的定义类的语法。而JS的不同之处在于它能使用各种方法实现自己的类和对象。一般的实现有以下几种方式：</p>
<p>&nbsp;</p>
<p>1.工厂方式</p>
<p>工厂方式是指创建一个返回特定对象类型的工厂函数，示例代码如下：</p>
<p>function createCar(sColor,iDoors,iMpg)</p>
<p>{</p>
<p>var oTempCar=new Object;</p>
<p>oTempCar.color=sColor;</p>
<p>oTempCar.doors=iDoors;</p>
<p>oTempCar.mpg=iMpg;</p>
<p>oTempCar.showColor=function()</p>
<p>{</p>
<p>alert(this.color);</p>
<p>}</p>
<p>return oTempCar;</p>
<p>}</p>
<p>var oCar1=createCar(&#8220;red&#8221;,4,23);</p>
<p>var oCar2=createCar(&#8220;blue&#8221;,3,25);</p>
<p>oCar1.showColor();</p>
<p>oCar2.showColor();</p>
<p>这种方式每次调用它的工厂函数，都会创建一个新对象。可问题在于每次生成一个新对象，都要创建新函数showColor,这使得每个对象都有自己的showColor版本，而事实上，所有的对象都共享同一个函数.为解决这个问题，开发者在工厂函数的外面定义了对象的方法，然后赋予对象一个指针指向这个这个函数，如下</p>
<p>function showColor()</p>
<p>{</p>
<p>alert(this.color);</p>
<p>}</p>
<p>function createCar(sColor,iDoors,iMpg)</p>
<p>{</p>
<p>var oTempCar=new Object;</p>
<p>oTempCar.color=sColor;</p>
<p>oTempCar.doors=iDoors;</p>
<p>oTempCar.mpg=iMpg;</p>
<p>oTempCar.showColor=showColor;</p>
<p>return oTempCar;</p>
<p>}</p>
<p>var oCar1=createCar(&#8220;red&#8221;,4,23);</p>
<p>var oCar2=createCar(&#8220;blue&#8221;,3,25);</p>
<p>oCar1.showColor();</p>
<p>oCar2.showColor();</p>
<p>这样就不需要为每一个对象都创建自己的showColor函数，而只是创建指向这个函数的指针.这从功能上解决了问题，但是该函数却不像对象的方法。于是，引出了构造函数的方式。</p>
<p>&nbsp;</p>
<p>2.构造函数方式</p>
<p>构造函数与工厂函数很相似，示例代码如下：</p>
<p>function Car(sColor,iDoors,iMpg)</p>
<p>{</p>
<p>this.color=sColor;</p>
<p>this.doors=iDoors;</p>
<p>this.mpg=iMpg;</p>
<p>this.showColor=function()</p>
<p>{</p>
<p>alert(this.color);</p>
<p>}</p>
<p>}</p>
<p>var oCar1=new Car(&#8220;red&#8221;,4,23);</p>
<p>var oCar2=new Car(&#8220;blue&#8221;,3,25);</p>
<p>在构造函数中，内部无创建对象，而是使用this关键字。使用new运算符调用构造函数时，在执行第一行代码之前先创建一个对象，只有用this才能访问这个对象。但是这会遇到什么问题呢，很显然，它的每个对象也都会创建自己的showColor函数版本。为解决这个问题，引出了以下的原型方式.</p>
<p>&nbsp;</p>
<p>3.原型方式</p>
<p>该方式利用了对象的prototype属性，可把它看成创建新对象所依赖的原型。这里，用空构造函数来设置类名。然后把所有的方法和属性都直接赋予prototype属性。如下:</p>
<p>function Car()</p>
<p>{}</p>
<p>Car.prototype.color=&#8221;red&#8221;;</p>
<p>Car.prototype.doors=4;</p>
<p>Car.prototype.mpg=23;</p>
<p>Car.prototype.drivers=new Array(&#8220;Mike&#8221;,&#8221;Sue&#8221;);</p>
<p>Car.prototype.showColor=function()</p>
<p>{</p>
<p>alert(this.color);</p>
<p>}</p>
<p>原型方式只能直接赋值，而不能通过给构造函数传递参数初始化属性的值。在用这种方式时，会遇到两个问题，不知道大家注意到没有。第一问题是采用这种方式必须创建每个对象后才能改变属性的默认值。而不能在创建每个对象时都会直接有自己所需要的属性值。这点很讨厌。第二个问题在于属性所指的是对象的时候。函数共享不会出现任何问题，但是对象共享却会出现问题。因为每个实例一般都要实现自己的对象。</p>
<p>&nbsp;</p>
<p>如下面:</p>
<p>var oCar1=new Car();</p>
<p>var oCar2=new Car();</p>
<p>oCar1.drivers.push(&#8220;Matt&#8221;);</p>
<p>alert(oCar1.drivers);//输出 &#8220;Mike,Sue,Matt&#8221;</p>
<p>alert(oCar2.drivers);//输出&#8221;Mike,Sue,Matt&#8221;</p>
<p>因此drivers属性只是指向对象的指针，所以所有的实例事实上共享同一个对象。由于出现这这些问题，我们引出了下面的联合使用构造函数和原型方式。</p>
<p>&nbsp;</p>
<p>4.混合的构造函数/原型方式</p>
<p>这种方式的思想是用构造函数定义对象的所有非函数属性（包括普通属性和指向对象的属性），用原型方式定义对象的函数属性（方法）。结果使得所有的函数都只被创建一次，而每个对象都有自己的对象属性实例。示例代码如下：</p>
<p>function Car(sColor,iDoors,iMpg)</p>
<p>{</p>
<p>this.color=sColor;</p>
<p>this.doors=iDoors;</p>
<p>this.mpg=iMpg;</p>
<p>this.drivers=new Array(&#8220;Mike&#8221;,&#8221;Sue&#8221;);</p>
<p>}</p>
<p>Car.prototype.showColor=function()</p>
<p>{</p>
<p>alert(this.color);</p>
<p>}</p>
<p>var oCar1=new Car(&#8220;red&#8221;,4,23);</p>
<p>var oCar2=new Car(&#8220;blue&#8221;,3,25);</p>
<p>oCar1.drivers.push(&#8220;Matt&#8221;);</p>
<p>alert(oCar1.drivers);//输出 &#8220;Mike,Sue,Matt&#8221;</p>
<p>alert(oCar2.drivers);//输出 &#8220;Mike,Sue&#8221;</p>
<p>由实例代码可知，这种方式同时解决了上一种方式的两个问题。不过，采用这种方式，仍有些开发者觉得不够完美。</p>
<p>&nbsp;</p>
<p>5.动态原型方式</p>
<p>我们可知，大多数面向对象语言都对属性和方法进行了视觉上的封装。而上述方式的showColor方法却定义在了类的外面。因此，他们设计了动态原型方法。这种方式的基本思想和混合的构造函数/原型方式相同，唯一不同之处在于对象方法的位置。如下所示：</p>
<p>function Car(sColor,iDoors,iMpg)</p>
<p>{</p>
<p>this.color=sColor;</p>
<p>this.doors=iDoors;</p>
<p>this.mpg=iMpg;</p>
<p>this.drivers=new Array(&#8220;Mike&#8221;,&#8221;Sue&#8221;);</p>
<p>if(typeof Car._initialized==&#8221;undefined&#8221;)</p>
<p>{</p>
<p>Car.prototype.showColor=function()</p>
<p>{</p>
<p>alert(this.color);</p>
<p>}</p>
<p>}</p>
<p>Car._initialized=true;</p>
<p>}</p>
<p>这种方式Car.prototype.showColor只被创建一次。这样依赖，这段代码更像其他语言中的类定义了。</p>
<p>&nbsp;</p>
<p>6.混合工厂方式</p>
<p>这种方式通常是不能应该前一种方式的变通方法。它的目的是创建假构造函数，只返回另一种对象的新实例。</p>
<p>function createCar()</p>
<p>{</p>
<p>var oTempCar=new Object;</p>
<p>oTempCar.color=“red”;</p>
<p>oTempCar.doors=4;</p>
<p>oTempCar.mpg=23;</p>
<p>oTempCar.showColor=function()</p>
<p>{</p>
<p>alert(this.color);</p>
<p>};</p>
<p>return oTempCar;</p>
<p>}</p>
<p>var car=new Car();</p>
<p>由于在Car()构造函数内部调用了new运算符，所以自动忽略第二个new运算符。在构造函数内部创建的对象被传递回变量var。这种方式在对象方法的内部管理方面与经典方式有着相同的问题。所以强烈建议：除非万不得已，还是避免使用这种方式。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.raoxia.com/%e8%80%81%e5%a4%96%e5%81%9a%e5%b0%8f%e5%ad%a6%e5%a5%a5%e6%95%b0%e7%ab%9e%e8%b5%9b/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>语法作用域与词法作用域</title>
		<link>http://www.raoxia.com/%e5%85%b6%e5%ae%9e%e9%9b%8d%e6%ad%a3%e6%9c%80%e5%8f%af%e7%88%b1%e7%9a%84%e5%a5%8f%e6%8a%98%e6%98%af/</link>
		<comments>http://www.raoxia.com/%e5%85%b6%e5%ae%9e%e9%9b%8d%e6%ad%a3%e6%9c%80%e5%8f%af%e7%88%b1%e7%9a%84%e5%a5%8f%e6%8a%98%e6%98%af/#respond</comments>
		<pubDate>Sun, 08 Jun 2014 05:56:02 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.raoxia.com/?p=363</guid>
		<description><![CDATA[<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
	<li class="hl-firstline">var classA = function (){</li>
	<li>    this . prop1 = 1 ;</li>
	<li>}</li>
	<li>classA . prototype . func1 = function (){</li>
	<li>    var   that = this ,</li>
	<li>        var1 = 2 ;</li>
	<li></li>
	<li>    function   a (){</li>
	<li>        return   function (){</li>
	<li>            alert ( var1 ) ;</li>
	<li>            alert ( this . prop1 ) ;</li>
	<li>        } . apply ( that ) ;</li>
	<li>    } ;</li>
	<li>    a () ;</li>
	<li>}</li>
	<li>var   objA = new ClassA () ;</li>
	<li>objA . func1 () ;</li>
</ol>
</div>
大家应该写过上面类似的代码吧，其实这里我想要表达的是有时候一个方法定义的地方和使用的地方会相隔十万八千里，那方法执行时，它能访问哪些变量，不能访问哪些变量，这个怎么判断呢？这个就是我们这次需要分析的问题—词法作用域

<strong>词法作用域：</strong> 变量的作用域是在定义时决定而不是执行时决定，也就是说词法作用域取决于源码，通过静态分析就能确定，因此词法作用域也叫做静态作用域。 with和eval除外，所以只能说JS的作用域机制非常接近词法作用域（Lexical scope）。

&#160;

下面通过几个小小的案例，开始深入的了解对理解词法作用域和闭包必不可少的，JS执行时底层的一些概念和理论知识。
<h3><a name="t0"></a>经典案列重现</h3>
<h4><a name="t1"></a>1、经典案例一</h4>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
	<li class="hl-firstline">/*全局（window）域下的一段代码*/</li>
	<li>function   a ( i ) {</li>
	<li>    var   i ;</li>
	<li>    alert ( i ) ;</li>
	<li>} ;</li>
	<li>a ( 10 ) ;</li>
</ol>
</div>
疑问：上面的代码会输出什么呢？
答案：没错，就是弹出10。具体执行过程应该是这样的
<ol>
	<li>a 函数有一个形参 i，调用 a 函数时传入实参 10，形参 i=10</li>
	<li>接着定义一个同名的局部变量 i，未赋值</li>
	<li>alert 输出 10</li>
	<li>思考：局部变量 i 和形参 i 是同一个存储空间吗？</li>
</ol>
<h4><a name="t2"></a>2、经典案例二</h4>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
	<li class="hl-firstline">/*全局（window）域下的一段代码*/</li>
	<li>function   a ( i ) {</li>
	<li>    alert ( i ) ;</li>
	<li>    alert ( arguments [ 0 ]) ; //arguments[0]应该就是形参 i</li>
	<li>    var   i = 2 ;</li>
	<li>    alert ( i ) ;</li>
	<li>    alert ( arguments [ 0 ]) ;</li>
	<li>} ;</li>
	<li>a ( 10 ) ;</li>
</ol>
</div>
疑问：上面的代码又会输出什么呢？（（ 10,10,2,10 &#124;&#124; 10,10,2,2 ））
答案：在FireBug中的运行结果是第二个10,10,2,2，猜对了… ，下面简单说一下具体执行过程
<ol>
	<li>a 函数有一个形参i，调用 a 函数时传入实参 10，形参 i=10</li>
	<li>第一个 alert 把形参 i 的值 10 输出</li>
	<li>第二个 alert 把 arguments[0] 输出，应该也是 i</li>
	<li>接着定义个局部变量 i 并赋值为2，这时候局部变量 i=2</li>
	<li>第三个 alert 就把局部变量 i 的值 2 输出</li>
	<li>第四个alert再次把 arguments[0] 输出</li>
	<li>思考：这里能说明局部变量 i 和形参 i 的值相同吗？</li>
</ol>
<h4><a name="t3"></a>3、经典案例三</h4>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
	<li class="hl-firstline">/*全局（window）域下的一段代码*/</li>
	<li>function   a ( i ) {</li>
	<li>    var   i = i ;</li>
	<li>    alert ( i ) ;</li>
	<li>} ;</li>
	<li>a ( 10 ) ;</li>
</ol>
</div>
疑问：上面的代码又又会输出什么呢？（（ undefined &#124;&#124; 10 ））
答案：在FireBug中的运行结果是 10，下面简单说一下具体执行过程
<ol>
	<li>第一句声明一个与形参 i 同名的局部变量 i，根据结果我们知道，后一个 i 是指向了</li>
	<li>形参 i，所以这里就等于把形参 i 的值 10 赋了局部变量 i</li>
	<li>第二个 alert 当然就输出 10</li>
	<li>思考：结合案列二，这里基本能说明局部变量 i 和形参 i 指向了同一个存储地址！</li>
</ol>
<h4><a name="t4"></a>4、经典案例四</h4>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
	<li class="hl-firstline">/*全局（window）域下的一段代码*/</li>
	<li>var   i = 10 ;</li>
	<li>function   a () {</li>
	<li>    alert ( i ) ;</li>
	<li>    var   i = 2 ;</li>
	<li>    alert ( i ) ;</li>
	<li>} ;</li>
	<li>a () ;</li>
</ol>
</div>
疑问：上面的代码又会输出什么呢？（小子，看这回整不死你！哇哈哈，就不给你选项）
答案：在FireBug中的运行结果是 undefined, 2，下面简单说一下具体执行过程
<ol>
	<li>第一个alert输出undefined</li>
	<li>第二个alert输出 2</li>
	<li>思考：到底怎么回事儿？</li>
</ol>
<h4><a name="t5"></a>5、经典案例五…………..N</h4>
看到上面的几个例子，你可能会想，怎么可能，我写了几年的 js 了，怎么这么简单例子也会犹豫，结果可能还答错了。其实可能原因是：我们能很快的写出一个方法，但到底方法内部是怎么执行的呢？执行的细节又是怎么样的呢？你可能没有进行过深入的学习和了解。要了解这些细节，那就需要了解 JS 引擎的工作方式，所以下面我们就把 JS 引擎对一个方法的解析过程进行一个稍微深入一些的介绍
<h4><a name="t6"></a>解析过程</h4>
<strong>1、执行顺序</strong>
<ul>
	<li>编译型语言，编译步骤分为：词法分析、语法分析、语义检查、代码优化和字节生成。</li>
	<li>解释型语言，通过词法分析和语法分析得到语法分析树后，就可以开始解释执行了。这里是一个简单原始的关于解析过程的原理，仅作为参考，详细的解析过程（各种JS引擎还有不同）还需要更深一步的研究</li>
</ul>
JavaScript执行过程，如果一个文档流中包含多个script代码段（用script标签分隔的js代码或引入的js文件），它们的运行顺序是：
<ol>
	<li>步骤1. 读入第一个代码段（js执行引擎并非一行一行地执行程序，而是一段一段地分析执行的）</li>
	<li>步骤2. 做词法分析和语法分析，有错则报语法错误（比如括号不匹配等），并跳转到步骤5</li>
	<li>步骤3. 对【var】变量和【function】定义做“预解析“（永远不会报错的，因为只解析正确的声明）</li>
	<li>步骤4. 执行代码段，有错则报错（比如变量未定义）</li>
	<li>步骤5. 如果还有下一个代码段，则读入下一个代码段，重复步骤2</li>
	<li>步骤6. 结束</li>
</ol>
<strong>2、特殊说明</strong>
全局域（window）域下所有JS代码可以被看成是一个“匿名方法“，它会被自动执行，而此“匿名方法“内的其它方法则是在被显示调用的时候才被执行
<strong>3、关键步骤</strong>
上面的过程，我们主要是分成两个阶段
<ol>
	<li>解析：就是通过语法分析和预解析构造合法的语法分析树。</li>
	<li>执行：执行具体的某个function，JS引擎在执行每个函数实例时，都会创建一个执行环境（ExecutionContext）和活动对象（activeObject）（它们属于宿主对象，与函数实例的生命周期保持一致）</li>
</ol>
<strong>3、关键概念</strong>
到这里，我们再更强调以下一些概念，这些概念都会在下面用一个一个的实体来表示，便于大家理解
<ul>
	<li>语法分析树（SyntaxTree）可以直观地表示出这段代码的相关信息,具体的实现就是JS引擎创建了一些表，用来记录每个方法内的变量集（variables），方法集（functions）和作用域（scope）等</li>
	<li>执行环境（ExecutionContext）可理解为一个记录当前执行的方法【外部描述信息】的对象,记录所执行方法的类型，名称，参数和活动对象（activeObject）</li>
	<li>活动对象（activeObject）可理解为一个记录当前执行的方法【内部执行信息】的对象,记录内部变量集（variables）、内嵌函数集（functions）、实参（arguments）、作用域链（scopeChain）等执行所需信息，其中内部变量集（variables）、内嵌函数集（functions）是直接从第一步建立的语法分析树复制过来的</li>
	<li>词法作用域：变量的作用域是在定义时决定而不是执行时决定，也就是说词法作用域取决于源码，通过静态分析就能确定，因此词法作用域也叫做静态作用域。 with和eval除外，所以只能说JS的作用域机制非常接近词法作用域（Lexical scope）</li>
	<li>作用域链：词法作用域的实现机制就是作用域链（scopeChain）。作用域链是一套按名称查找（Name Lookup）的机制，首先在当前执行环境的 ActiveObject 中寻找，没找到，则顺着作用域链到父 ActiveObject 中寻找，一直找到全局调用对象（Global Object）</li>
</ul>
<strong>4、实体表示</strong>
<img src="http://ued.sohu.com/uploads/2009/11/%E6%8D%95%E8%8E%B7.JPG" alt="源码，语法分析树，执行环境和活动对象的引用关系" />
<h3><a name="t7"></a>解析模拟</h3>
估计，看到这儿，大家还是很朦胧吧，什么是语法分析树，语法分析树到底长什么样子，作用域链又怎么实现的，活动对象又有什么内容等等，还是不是太清晰，下面我们就通过一段实际的代码来模拟整个解析过程，我们就把语法分析树，活动对象实实在在的创建出来，理解作用域，作用域链的到底是怎么实现的
<strong>1、模拟代码</strong>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
	<li class="hl-firstline">/*全局（window）域下的一段代码*/</li>
	<li>var   i = 1 , j = 2 , k = 3 ;</li>
	<li>function   a ( o , p , x , q ){</li>
	<li>    var   x = 4 ;</li>
	<li>        alert ( i ) ;</li>
	<li>    function   b ( r , s ) {</li>
	<li>        var   i = 11 , y = 5 ;</li>
	<li>            alert ( i ) ;</li>
	<li>        function   c ( t ){</li>
	<li>          var   z = 6 ;</li>
	<li>                alert ( i ) ;</li>
	<li>        } ;</li>
	<li>            //函数表达式</li>
	<li>        var   d = function (){</li>
	<li>                alert ( y ) ;</li>
	<li>            } ;</li>
	<li>            c ( 60 ) ;</li>
	<li>            d () ;</li>
	<li>    } ;</li>
	<li>        b ( 40 , 50 ) ;</li>
	<li>}</li>
	<li>a ( 10 , 20 , 30 ) ;</li>
</ol>
</div>
<strong>2、语法分析树</strong>
上面的代码很简单，就是先定义了一些全局变量和全局方法，接着在方法内再定义局部变量和局部方法，现在JS解释器读入这段代码开始解析，前面提到 JS 引擎会先通过语法分析和预解析得到语法分析树，至于语法分析树长什么样儿，都有些什么信息，下面我们以一种简单的结构：一个 JS 对象(为了清晰表示个各种对象间的引用关系，这里的只是伪对象表示，可能无法运行)来描述语法分析树（这是我们比较熟悉的，实际结构我们不去深究，肯定复杂得多，这里是为了帮助理解解析过程而特意简化）
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
	<li class="hl-firstline">/**</li>
	<li>* 模拟建立一棵语法分析树，存储function内的变量和方法</li>
	<li>*/</li>
	<li>var   SyntaxTree = {</li>
	<li>        // 全局对象在语法分析树中的表示</li>
	<li>    window : {</li>
	<li>        variables : {</li>
	<li>            i : {   value : 1 } ,</li>
	<li>            j : {   value : 2 } ,</li>
	<li>            k : {   value : 3 }</li>
	<li>        } ,</li>
	<li>        functions : {</li>
	<li>            a : this . a</li>
	<li>        }</li>
	<li>    } ,</li>
	<li></li>
	<li>    a : {</li>
	<li>        variables : {</li>
	<li>            x : ' undefined '</li>
	<li>        } ,</li>
	<li>        functions : {</li>
	<li>            b : this . b</li>
	<li>        } ,</li>
	<li>        scope : this . window</li>
	<li>    } ,</li>
	<li></li>
	<li>    b : {</li>
	<li>        variables : {</li>
	<li>            y : ' undefined '</li>
	<li>        } ,</li>
	<li>        functions : {</li>
	<li>            c : this . c ,</li>
	<li>            d : this . d</li>
	<li>        } ,</li>
	<li>        scope : this . a</li>
	<li>    } ,</li>
	<li></li>
	<li>    c : {</li>
	<li>        variables : {</li>
	<li>            z : ' undefined '</li>
	<li>        } ,</li>
	<li>        functions : {} ,</li>
	<li>        scope : this . b</li>
	<li>    } ,</li>
	<li></li>
	<li>    d : {</li>
	<li>        variables : {} ,</li>
	<li>        functions : {} ,</li>
	<li>        scope : {</li>
	<li>           myname : d ,</li>
	<li>           scope : this . b</li>
	<li>        }</li>
	<li>    }</li>
	<li>} ;</li>
</ol>
</div>
上面就是关于语法分析树的一个简单表示，正如我们前面分析的，语法分析树主要记录了每个 function 中的变量集（variables），方法集（functions）和作用域（scope）
语法分析树关键点
<ul>
	<li>1变量集（variables）中，只有变量定义，没有变量值，这时候的变量值全部为“undefined”</li>
	<li>2作用域（scope），根据词法作用域的特点，这个时候每个变量的作用域就已经明确了，而不会随执行时的环境而改变。【什么意思呢？就是我们经常将一个方法 return 回去，然后在另外一个方法中去执行，执行时，方法中变量的作用域是按照方法定义时的作用域走。其实这里想表达的意思就是不管你在多么复杂，多么远的地方执行该方法，最终判断方法中变量能否被访问还是得回到方法定义时的地方查证】</li>
	<li>3作用域（scope）建立规则</li>
	<li>a对于函数声明和匿名函数表达式来说，[scope]就是它创建时的作用域</li>
	<li>b对于有名字的函数表达式，[scope]顶端是一个新的JS对象（也就是继承了Object.prototype），这个对象有两个属性，第一个是自身的名称，第二个是定义的作用域，第一个函数名称是为了确保函数内部的代码可以无误地访问自己的函数名进行递归。</li>
</ul>
<strong>3、执行环境与活动对象</strong>
语法分析完成，开始执行代码。我们调用每一个方法的时候，JS 引擎都会自动为其建立一个执行环境和一个活动对象，它们和方法实例的生命周期保持一致，为方法执行提供必要的执行支持，针对上面的几个方法，我们这里统一为其建立了活动对象（按道理是在执行方法的时候才会生成活动对象，为了便于演示，这里一下子定义了所有方法的活动对象），具体如下：
<strong>执行环境</strong>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
	<li class="hl-firstline">/**</li>
	<li>* 执行环境:函数执行时创建的执行环境</li>
	<li>*/</li>
	<li>var   ExecutionContext = {</li>
	<li>    window : {</li>
	<li>        type : ' global ' ,</li>
	<li>        name : ' global ' ,</li>
	<li>        body : ActiveObject . window</li>
	<li>    } ,</li>
	<li></li>
	<li>    a : {</li>
	<li>        type : ' function ' ,</li>
	<li>        name : ' a ' ,</li>
	<li>        body : ActiveObject . a ,</li>
	<li>        scopeChain : this . window . body</li>
	<li>    } ,</li>
	<li></li>
	<li>    b : {</li>
	<li>        type : ' function ' ,</li>
	<li>        name : ' b ' ,</li>
	<li>        body : ActiveObject . b ,</li>
	<li>        scopeChain : this . a . body</li>
	<li>    } ,</li>
	<li></li>
	<li>    c : {</li>
	<li>        type : ' function ' ,</li>
	<li>        name : ' c ' ,</li>
	<li>        body : ActiveObject . c ,</li>
	<li>        scopeChain : this . b . body</li>
	<li>    } ,</li>
	<li></li>
	<li>    d : {</li>
	<li>        type : ' function ' ,</li>
	<li>        name : ' d ' ,</li>
	<li>        body : ActiveObject . d ,</li>
	<li>        scopeChain : this . b . body</li>
	<li>    }</li>
	<li>}</li>
</ol>
</div>
上面每一个方法的执行环境都存储了相应方法的类型（function）、方法名称（funcName）、活动对象（ActiveObject）、作用域链（scopeChain）等信息,其关键点如下：
<ul>
	<li>body属性，直接指向当前方法的活动对象</li>
	<li>scopeChain属性，作用域链，它是一个链表结构，根据语法分析树中当前方法对应的scope属性，它指向scope对应的方法的活动对象（ActivceObject），变量查找就是跟着这条链条查找的</li>
</ul>
<strong>活动对象</strong>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
	<li class="hl-firstline">/**</li>
	<li>* 活动对象：函数执行时创建的活动对象列表</li>
	<li>*/</li>
	<li>var   ActiveObject = {</li>
	<li>        window : {</li>
	<li>        variables : {</li>
	<li>            i : {   value : 1 } ,</li>
	<li>            j : {   value : 2 } ,</li>
	<li>            k : {   value : 3 }</li>
	<li>        } ,</li>
	<li>        functions : {</li>
	<li>            a : this . a</li>
	<li>        }</li>
	<li>    } ,</li>
	<li></li>
	<li>    a : {</li>
	<li>        variables : {</li>
	<li>            x : { value : 4 }</li>
	<li>        } ,</li>
	<li>        functions : {</li>
	<li>            b : SyntaxTree . b</li>
	<li>        } ,</li>
	<li>        parameters : {</li>
	<li>            o : { value : 10 } ,</li>
	<li>            p : { value : 20 } ,</li>
	<li>            x : this . variables . x ,</li>
	<li>            q : ' undefined '</li>
	<li>        } ,</li>
	<li>        arguments : [ this . parameters . o , this . parameters . p , this . parameters . x ]</li>
	<li>    } ,</li>
	<li></li>
	<li>    b : {</li>
	<li>        variables : {</li>
	<li>            y : {   value : 5 }</li>
	<li>        } ,</li>
	<li>        functions : {</li>
	<li>            c : SyntaxTree . c ,</li>
	<li>            d : SyntaxTree . d</li>
	<li>        } ,</li>
	<li>        parameters : {</li>
	<li>            r : { value : 40 } ,</li>
	<li>            s : { value : 50 }</li>
	<li>        } ,</li>
	<li>        arguments : [ this . parameters . r , this . parameters . s ]</li>
	<li>    } ,</li>
	<li></li>
	<li>    c : {</li>
	<li>        variables : {</li>
	<li>            z : {   value : 6 }</li>
	<li>        } ,</li>
	<li>        functions : {} ,</li>
	<li>        parameters : {</li>
	<li>            u : { value : 70 }</li>
	<li>        } ,</li>
	<li>        arguments : [ this . parameters . u ]</li>
	<li>    } ,</li>
	<li></li>
	<li>    d : {</li>
	<li>        variables : {} ,</li>
	<li>        functions : {} ,</li>
	<li>        parameters : {} ,</li>
	<li>        arguments : []</li>
	<li>    }</li>
	<li>}</li>
</ol>
</div>
上面每一个活动对象都存储了相应方法的内部变量集（variables）、内嵌函数集（functions）、形参（parameters）、实参（arguments）等执行所需信息，活动对象关键点
<ul>
	<li>创建活动对象，从语法分析树复制方法的内部变量集（variables）和内嵌函数集（functions）</li>
	<li>方法开始执行，活动对象里的内部变量集全部被重置为 undefined</li>
	<li>创建形参（parameters）和实参（arguments）对象，同名的实参，形参和变量之间是【引用】关系</li>
	<li>执行方法内的赋值语句，这才会对变量集中的变量进行赋值处理</li>
	<li>变量查找规则是首先在当前执行环境的 ActiveObject 中寻找，没找到，则顺着执行环境中属性 ScopeChain 指向的 ActiveObject 中寻找，一直到 Global Object（window）</li>
	<li>方法执行完成后，内部变量值不会被重置，至于变量什么时候被销毁，请参考下面一条</li>
	<li>方法内变量的生存周期取决于方法实例是否存在活动引用，如没有就销毁活动对象</li>
	<li>6和7 是使闭包能访问到外部变量的根本原因</li>
</ul>
<h3><a name="t8"></a>重释经典案例</h3>
案列一二三

根据【在一个方法中，同名的实参，形参和变量之间是引用关系，也就是JS引擎的处理是同名变量和形参都引用同一个内存地址】，所以才会有二中的修改arguments会影响到局部变量的情况出现

案例四

根据【JS引擎变量查找规则，首先在当前执行环境的 ActiveObject 中寻找，没找到，则顺着执行环境中属性 ScopeChain 指向的 ActiveObject 中寻找，一直到 Global Object（window）】，所以在四中，因为在当前的ActiveObject中找到了有变量 i 的定义，只是值为 “undefined”，所以直接输出 “undefined” 了
<h3><a name="t9"></a>总结</h3>
以上是我在学习和使用了JS一段时间后,为了更深入的了解它, 也为了更好的把握对它的应用, 从而在对闭包的学习过程中,自己对于词法作用域的一些理解和总结,中间可能有一些地方和真实的JS解释引擎有差异,因为我只是站在一个刚入门的前端开发人员而不是系统设计者的角度上去分析这个问题，希望能对JS开发者理解此法作用域带来一些帮助！]]></description>
				<content:encoded><![CDATA[<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
<li class="hl-firstline">var classA = function (){</li>
<li>    this . prop1 = 1 ;</li>
<li>}</li>
<li>classA . prototype . func1 = function (){</li>
<li>    var   that = this ,</li>
<li>        var1 = 2 ;</li>
<li></li>
<li>    function   a (){</li>
<li>        return   function (){</li>
<li>            alert ( var1 ) ;</li>
<li>            alert ( this . prop1 ) ;</li>
<li>        } . apply ( that ) ;</li>
<li>    } ;</li>
<li>    a () ;</li>
<li>}</li>
<li>var   objA = new ClassA () ;</li>
<li>objA . func1 () ;</li>
</ol>
</div>
<p>大家应该写过上面类似的代码吧，其实这里我想要表达的是有时候一个方法定义的地方和使用的地方会相隔十万八千里，那方法执行时，它能访问哪些变量，不能访问哪些变量，这个怎么判断呢？这个就是我们这次需要分析的问题—词法作用域</p>
<p><strong>词法作用域：</strong> 变量的作用域是在定义时决定而不是执行时决定，也就是说词法作用域取决于源码，通过静态分析就能确定，因此词法作用域也叫做静态作用域。 with和eval除外，所以只能说JS的作用域机制非常接近词法作用域（Lexical scope）。</p>
<p>&nbsp;</p>
<p>下面通过几个小小的案例，开始深入的了解对理解词法作用域和闭包必不可少的，JS执行时底层的一些概念和理论知识。</p>
<h3><a name="t0"></a>经典案列重现</h3>
<h4><a name="t1"></a>1、经典案例一</h4>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
<li class="hl-firstline">/*全局（window）域下的一段代码*/</li>
<li>function   a ( i ) {</li>
<li>    var   i ;</li>
<li>    alert ( i ) ;</li>
<li>} ;</li>
<li>a ( 10 ) ;</li>
</ol>
</div>
<p>疑问：上面的代码会输出什么呢？<br />
答案：没错，就是弹出10。具体执行过程应该是这样的</p>
<ol>
<li>a 函数有一个形参 i，调用 a 函数时传入实参 10，形参 i=10</li>
<li>接着定义一个同名的局部变量 i，未赋值</li>
<li>alert 输出 10</li>
<li>思考：局部变量 i 和形参 i 是同一个存储空间吗？</li>
</ol>
<h4><a name="t2"></a>2、经典案例二</h4>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
<li class="hl-firstline">/*全局（window）域下的一段代码*/</li>
<li>function   a ( i ) {</li>
<li>    alert ( i ) ;</li>
<li>    alert ( arguments [ 0 ]) ; //arguments[0]应该就是形参 i</li>
<li>    var   i = 2 ;</li>
<li>    alert ( i ) ;</li>
<li>    alert ( arguments [ 0 ]) ;</li>
<li>} ;</li>
<li>a ( 10 ) ;</li>
</ol>
</div>
<p>疑问：上面的代码又会输出什么呢？（（ 10,10,2,10 || 10,10,2,2 ））<br />
答案：在FireBug中的运行结果是第二个10,10,2,2，猜对了… ，下面简单说一下具体执行过程</p>
<ol>
<li>a 函数有一个形参i，调用 a 函数时传入实参 10，形参 i=10</li>
<li>第一个 alert 把形参 i 的值 10 输出</li>
<li>第二个 alert 把 arguments[0] 输出，应该也是 i</li>
<li>接着定义个局部变量 i 并赋值为2，这时候局部变量 i=2</li>
<li>第三个 alert 就把局部变量 i 的值 2 输出</li>
<li>第四个alert再次把 arguments[0] 输出</li>
<li>思考：这里能说明局部变量 i 和形参 i 的值相同吗？</li>
</ol>
<h4><a name="t3"></a>3、经典案例三</h4>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
<li class="hl-firstline">/*全局（window）域下的一段代码*/</li>
<li>function   a ( i ) {</li>
<li>    var   i = i ;</li>
<li>    alert ( i ) ;</li>
<li>} ;</li>
<li>a ( 10 ) ;</li>
</ol>
</div>
<p>疑问：上面的代码又又会输出什么呢？（（ undefined || 10 ））<br />
答案：在FireBug中的运行结果是 10，下面简单说一下具体执行过程</p>
<ol>
<li>第一句声明一个与形参 i 同名的局部变量 i，根据结果我们知道，后一个 i 是指向了</li>
<li>形参 i，所以这里就等于把形参 i 的值 10 赋了局部变量 i</li>
<li>第二个 alert 当然就输出 10</li>
<li>思考：结合案列二，这里基本能说明局部变量 i 和形参 i 指向了同一个存储地址！</li>
</ol>
<h4><a name="t4"></a>4、经典案例四</h4>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
<li class="hl-firstline">/*全局（window）域下的一段代码*/</li>
<li>var   i = 10 ;</li>
<li>function   a () {</li>
<li>    alert ( i ) ;</li>
<li>    var   i = 2 ;</li>
<li>    alert ( i ) ;</li>
<li>} ;</li>
<li>a () ;</li>
</ol>
</div>
<p>疑问：上面的代码又会输出什么呢？（小子，看这回整不死你！哇哈哈，就不给你选项）<br />
答案：在FireBug中的运行结果是 undefined, 2，下面简单说一下具体执行过程</p>
<ol>
<li>第一个alert输出undefined</li>
<li>第二个alert输出 2</li>
<li>思考：到底怎么回事儿？</li>
</ol>
<h4><a name="t5"></a>5、经典案例五…………..N</h4>
<p>看到上面的几个例子，你可能会想，怎么可能，我写了几年的 js 了，怎么这么简单例子也会犹豫，结果可能还答错了。其实可能原因是：我们能很快的写出一个方法，但到底方法内部是怎么执行的呢？执行的细节又是怎么样的呢？你可能没有进行过深入的学习和了解。要了解这些细节，那就需要了解 JS 引擎的工作方式，所以下面我们就把 JS 引擎对一个方法的解析过程进行一个稍微深入一些的介绍</p>
<h4><a name="t6"></a>解析过程</h4>
<p><strong>1、执行顺序</strong></p>
<ul>
<li>编译型语言，编译步骤分为：词法分析、语法分析、语义检查、代码优化和字节生成。</li>
<li>解释型语言，通过词法分析和语法分析得到语法分析树后，就可以开始解释执行了。这里是一个简单原始的关于解析过程的原理，仅作为参考，详细的解析过程（各种JS引擎还有不同）还需要更深一步的研究</li>
</ul>
<p>JavaScript执行过程，如果一个文档流中包含多个script代码段（用script标签分隔的js代码或引入的js文件），它们的运行顺序是：</p>
<ol>
<li>步骤1. 读入第一个代码段（js执行引擎并非一行一行地执行程序，而是一段一段地分析执行的）</li>
<li>步骤2. 做词法分析和语法分析，有错则报语法错误（比如括号不匹配等），并跳转到步骤5</li>
<li>步骤3. 对【var】变量和【function】定义做“预解析“（永远不会报错的，因为只解析正确的声明）</li>
<li>步骤4. 执行代码段，有错则报错（比如变量未定义）</li>
<li>步骤5. 如果还有下一个代码段，则读入下一个代码段，重复步骤2</li>
<li>步骤6. 结束</li>
</ol>
<p><strong>2、特殊说明</strong><br />
全局域（window）域下所有JS代码可以被看成是一个“匿名方法“，它会被自动执行，而此“匿名方法“内的其它方法则是在被显示调用的时候才被执行<br />
<strong>3、关键步骤</strong><br />
上面的过程，我们主要是分成两个阶段</p>
<ol>
<li>解析：就是通过语法分析和预解析构造合法的语法分析树。</li>
<li>执行：执行具体的某个function，JS引擎在执行每个函数实例时，都会创建一个执行环境（ExecutionContext）和活动对象（activeObject）（它们属于宿主对象，与函数实例的生命周期保持一致）</li>
</ol>
<p><strong>3、关键概念</strong><br />
到这里，我们再更强调以下一些概念，这些概念都会在下面用一个一个的实体来表示，便于大家理解</p>
<ul>
<li>语法分析树（SyntaxTree）可以直观地表示出这段代码的相关信息,具体的实现就是JS引擎创建了一些表，用来记录每个方法内的变量集（variables），方法集（functions）和作用域（scope）等</li>
<li>执行环境（ExecutionContext）可理解为一个记录当前执行的方法【外部描述信息】的对象,记录所执行方法的类型，名称，参数和活动对象（activeObject）</li>
<li>活动对象（activeObject）可理解为一个记录当前执行的方法【内部执行信息】的对象,记录内部变量集（variables）、内嵌函数集（functions）、实参（arguments）、作用域链（scopeChain）等执行所需信息，其中内部变量集（variables）、内嵌函数集（functions）是直接从第一步建立的语法分析树复制过来的</li>
<li>词法作用域：变量的作用域是在定义时决定而不是执行时决定，也就是说词法作用域取决于源码，通过静态分析就能确定，因此词法作用域也叫做静态作用域。 with和eval除外，所以只能说JS的作用域机制非常接近词法作用域（Lexical scope）</li>
<li>作用域链：词法作用域的实现机制就是作用域链（scopeChain）。作用域链是一套按名称查找（Name Lookup）的机制，首先在当前执行环境的 ActiveObject 中寻找，没找到，则顺着作用域链到父 ActiveObject 中寻找，一直找到全局调用对象（Global Object）</li>
</ul>
<p><strong>4、实体表示</strong><br />
<img src="http://ued.sohu.com/uploads/2009/11/%E6%8D%95%E8%8E%B7.JPG" alt="源码，语法分析树，执行环境和活动对象的引用关系" /></p>
<h3><a name="t7"></a>解析模拟</h3>
<p>估计，看到这儿，大家还是很朦胧吧，什么是语法分析树，语法分析树到底长什么样子，作用域链又怎么实现的，活动对象又有什么内容等等，还是不是太清晰，下面我们就通过一段实际的代码来模拟整个解析过程，我们就把语法分析树，活动对象实实在在的创建出来，理解作用域，作用域链的到底是怎么实现的<br />
<strong>1、模拟代码</strong></p>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
<li class="hl-firstline">/*全局（window）域下的一段代码*/</li>
<li>var   i = 1 , j = 2 , k = 3 ;</li>
<li>function   a ( o , p , x , q ){</li>
<li>    var   x = 4 ;</li>
<li>        alert ( i ) ;</li>
<li>    function   b ( r , s ) {</li>
<li>        var   i = 11 , y = 5 ;</li>
<li>            alert ( i ) ;</li>
<li>        function   c ( t ){</li>
<li>          var   z = 6 ;</li>
<li>                alert ( i ) ;</li>
<li>        } ;</li>
<li>            //函数表达式</li>
<li>        var   d = function (){</li>
<li>                alert ( y ) ;</li>
<li>            } ;</li>
<li>            c ( 60 ) ;</li>
<li>            d () ;</li>
<li>    } ;</li>
<li>        b ( 40 , 50 ) ;</li>
<li>}</li>
<li>a ( 10 , 20 , 30 ) ;</li>
</ol>
</div>
<p><strong>2、语法分析树</strong><br />
上面的代码很简单，就是先定义了一些全局变量和全局方法，接着在方法内再定义局部变量和局部方法，现在JS解释器读入这段代码开始解析，前面提到 JS 引擎会先通过语法分析和预解析得到语法分析树，至于语法分析树长什么样儿，都有些什么信息，下面我们以一种简单的结构：一个 JS 对象(为了清晰表示个各种对象间的引用关系，这里的只是伪对象表示，可能无法运行)来描述语法分析树（这是我们比较熟悉的，实际结构我们不去深究，肯定复杂得多，这里是为了帮助理解解析过程而特意简化）</p>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
<li class="hl-firstline">/**</li>
<li>* 模拟建立一棵语法分析树，存储function内的变量和方法</li>
<li>*/</li>
<li>var   SyntaxTree = {</li>
<li>        // 全局对象在语法分析树中的表示</li>
<li>    window : {</li>
<li>        variables : {</li>
<li>            i : {   value : 1 } ,</li>
<li>            j : {   value : 2 } ,</li>
<li>            k : {   value : 3 }</li>
<li>        } ,</li>
<li>        functions : {</li>
<li>            a : this . a</li>
<li>        }</li>
<li>    } ,</li>
<li></li>
<li>    a : {</li>
<li>        variables : {</li>
<li>            x : &#8216; undefined &#8216;</li>
<li>        } ,</li>
<li>        functions : {</li>
<li>            b : this . b</li>
<li>        } ,</li>
<li>        scope : this . window</li>
<li>    } ,</li>
<li></li>
<li>    b : {</li>
<li>        variables : {</li>
<li>            y : &#8216; undefined &#8216;</li>
<li>        } ,</li>
<li>        functions : {</li>
<li>            c : this . c ,</li>
<li>            d : this . d</li>
<li>        } ,</li>
<li>        scope : this . a</li>
<li>    } ,</li>
<li></li>
<li>    c : {</li>
<li>        variables : {</li>
<li>            z : &#8216; undefined &#8216;</li>
<li>        } ,</li>
<li>        functions : {} ,</li>
<li>        scope : this . b</li>
<li>    } ,</li>
<li></li>
<li>    d : {</li>
<li>        variables : {} ,</li>
<li>        functions : {} ,</li>
<li>        scope : {</li>
<li>           myname : d ,</li>
<li>           scope : this . b</li>
<li>        }</li>
<li>    }</li>
<li>} ;</li>
</ol>
</div>
<p>上面就是关于语法分析树的一个简单表示，正如我们前面分析的，语法分析树主要记录了每个 function 中的变量集（variables），方法集（functions）和作用域（scope）<br />
语法分析树关键点</p>
<ul>
<li>1变量集（variables）中，只有变量定义，没有变量值，这时候的变量值全部为“undefined”</li>
<li>2作用域（scope），根据词法作用域的特点，这个时候每个变量的作用域就已经明确了，而不会随执行时的环境而改变。【什么意思呢？就是我们经常将一个方法 return 回去，然后在另外一个方法中去执行，执行时，方法中变量的作用域是按照方法定义时的作用域走。其实这里想表达的意思就是不管你在多么复杂，多么远的地方执行该方法，最终判断方法中变量能否被访问还是得回到方法定义时的地方查证】</li>
<li>3作用域（scope）建立规则</li>
<li>a对于函数声明和匿名函数表达式来说，[scope]就是它创建时的作用域</li>
<li>b对于有名字的函数表达式，[scope]顶端是一个新的JS对象（也就是继承了Object.prototype），这个对象有两个属性，第一个是自身的名称，第二个是定义的作用域，第一个函数名称是为了确保函数内部的代码可以无误地访问自己的函数名进行递归。</li>
</ul>
<p><strong>3、执行环境与活动对象</strong><br />
语法分析完成，开始执行代码。我们调用每一个方法的时候，JS 引擎都会自动为其建立一个执行环境和一个活动对象，它们和方法实例的生命周期保持一致，为方法执行提供必要的执行支持，针对上面的几个方法，我们这里统一为其建立了活动对象（按道理是在执行方法的时候才会生成活动对象，为了便于演示，这里一下子定义了所有方法的活动对象），具体如下：<br />
<strong>执行环境</strong></p>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
<li class="hl-firstline">/**</li>
<li>* 执行环境:函数执行时创建的执行环境</li>
<li>*/</li>
<li>var   ExecutionContext = {</li>
<li>    window : {</li>
<li>        type : &#8216; global &#8216; ,</li>
<li>        name : &#8216; global &#8216; ,</li>
<li>        body : ActiveObject . window</li>
<li>    } ,</li>
<li></li>
<li>    a : {</li>
<li>        type : &#8216; function &#8216; ,</li>
<li>        name : &#8216; a &#8216; ,</li>
<li>        body : ActiveObject . a ,</li>
<li>        scopeChain : this . window . body</li>
<li>    } ,</li>
<li></li>
<li>    b : {</li>
<li>        type : &#8216; function &#8216; ,</li>
<li>        name : &#8216; b &#8216; ,</li>
<li>        body : ActiveObject . b ,</li>
<li>        scopeChain : this . a . body</li>
<li>    } ,</li>
<li></li>
<li>    c : {</li>
<li>        type : &#8216; function &#8216; ,</li>
<li>        name : &#8216; c &#8216; ,</li>
<li>        body : ActiveObject . c ,</li>
<li>        scopeChain : this . b . body</li>
<li>    } ,</li>
<li></li>
<li>    d : {</li>
<li>        type : &#8216; function &#8216; ,</li>
<li>        name : &#8216; d &#8216; ,</li>
<li>        body : ActiveObject . d ,</li>
<li>        scopeChain : this . b . body</li>
<li>    }</li>
<li>}</li>
</ol>
</div>
<p>上面每一个方法的执行环境都存储了相应方法的类型（function）、方法名称（funcName）、活动对象（ActiveObject）、作用域链（scopeChain）等信息,其关键点如下：</p>
<ul>
<li>body属性，直接指向当前方法的活动对象</li>
<li>scopeChain属性，作用域链，它是一个链表结构，根据语法分析树中当前方法对应的scope属性，它指向scope对应的方法的活动对象（ActivceObject），变量查找就是跟着这条链条查找的</li>
</ul>
<p><strong>活动对象</strong></p>
<div class="hl-surround">
<ol class="hl-main ln-show" title="Double click to hide line number.">
<li class="hl-firstline">/**</li>
<li>* 活动对象：函数执行时创建的活动对象列表</li>
<li>*/</li>
<li>var   ActiveObject = {</li>
<li>        window : {</li>
<li>        variables : {</li>
<li>            i : {   value : 1 } ,</li>
<li>            j : {   value : 2 } ,</li>
<li>            k : {   value : 3 }</li>
<li>        } ,</li>
<li>        functions : {</li>
<li>            a : this . a</li>
<li>        }</li>
<li>    } ,</li>
<li></li>
<li>    a : {</li>
<li>        variables : {</li>
<li>            x : { value : 4 }</li>
<li>        } ,</li>
<li>        functions : {</li>
<li>            b : SyntaxTree . b</li>
<li>        } ,</li>
<li>        parameters : {</li>
<li>            o : { value : 10 } ,</li>
<li>            p : { value : 20 } ,</li>
<li>            x : this . variables . x ,</li>
<li>            q : &#8216; undefined &#8216;</li>
<li>        } ,</li>
<li>        arguments : [ this . parameters . o , this . parameters . p , this . parameters . x ]</li>
<li>    } ,</li>
<li></li>
<li>    b : {</li>
<li>        variables : {</li>
<li>            y : {   value : 5 }</li>
<li>        } ,</li>
<li>        functions : {</li>
<li>            c : SyntaxTree . c ,</li>
<li>            d : SyntaxTree . d</li>
<li>        } ,</li>
<li>        parameters : {</li>
<li>            r : { value : 40 } ,</li>
<li>            s : { value : 50 }</li>
<li>        } ,</li>
<li>        arguments : [ this . parameters . r , this . parameters . s ]</li>
<li>    } ,</li>
<li></li>
<li>    c : {</li>
<li>        variables : {</li>
<li>            z : {   value : 6 }</li>
<li>        } ,</li>
<li>        functions : {} ,</li>
<li>        parameters : {</li>
<li>            u : { value : 70 }</li>
<li>        } ,</li>
<li>        arguments : [ this . parameters . u ]</li>
<li>    } ,</li>
<li></li>
<li>    d : {</li>
<li>        variables : {} ,</li>
<li>        functions : {} ,</li>
<li>        parameters : {} ,</li>
<li>        arguments : []</li>
<li>    }</li>
<li>}</li>
</ol>
</div>
<p>上面每一个活动对象都存储了相应方法的内部变量集（variables）、内嵌函数集（functions）、形参（parameters）、实参（arguments）等执行所需信息，活动对象关键点</p>
<ul>
<li>创建活动对象，从语法分析树复制方法的内部变量集（variables）和内嵌函数集（functions）</li>
<li>方法开始执行，活动对象里的内部变量集全部被重置为 undefined</li>
<li>创建形参（parameters）和实参（arguments）对象，同名的实参，形参和变量之间是【引用】关系</li>
<li>执行方法内的赋值语句，这才会对变量集中的变量进行赋值处理</li>
<li>变量查找规则是首先在当前执行环境的 ActiveObject 中寻找，没找到，则顺着执行环境中属性 ScopeChain 指向的 ActiveObject 中寻找，一直到 Global Object（window）</li>
<li>方法执行完成后，内部变量值不会被重置，至于变量什么时候被销毁，请参考下面一条</li>
<li>方法内变量的生存周期取决于方法实例是否存在活动引用，如没有就销毁活动对象</li>
<li>6和7 是使闭包能访问到外部变量的根本原因</li>
</ul>
<h3><a name="t8"></a>重释经典案例</h3>
<p>案列一二三</p>
<p>根据【在一个方法中，同名的实参，形参和变量之间是引用关系，也就是JS引擎的处理是同名变量和形参都引用同一个内存地址】，所以才会有二中的修改arguments会影响到局部变量的情况出现</p>
<p>案例四</p>
<p>根据【JS引擎变量查找规则，首先在当前执行环境的 ActiveObject 中寻找，没找到，则顺着执行环境中属性 ScopeChain 指向的 ActiveObject 中寻找，一直到 Global Object（window）】，所以在四中，因为在当前的ActiveObject中找到了有变量 i 的定义，只是值为 “undefined”，所以直接输出 “undefined” 了</p>
<h3><a name="t9"></a>总结</h3>
<p>以上是我在学习和使用了JS一段时间后,为了更深入的了解它, 也为了更好的把握对它的应用, 从而在对闭包的学习过程中,自己对于词法作用域的一些理解和总结,中间可能有一些地方和真实的JS解释引擎有差异,因为我只是站在一个刚入门的前端开发人员而不是系统设计者的角度上去分析这个问题，希望能对JS开发者理解此法作用域带来一些帮助！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.raoxia.com/%e5%85%b6%e5%ae%9e%e9%9b%8d%e6%ad%a3%e6%9c%80%e5%8f%af%e7%88%b1%e7%9a%84%e5%a5%8f%e6%8a%98%e6%98%af/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一端阅读</title>
		<link>http://www.raoxia.com/%e4%b8%80%e7%ab%af%e9%98%85%e8%af%bb/</link>
		<comments>http://www.raoxia.com/%e4%b8%80%e7%ab%af%e9%98%85%e8%af%bb/#respond</comments>
		<pubDate>Fri, 26 Apr 2013 06:39:38 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[资源共享]]></category>

		<guid isPermaLink="false">http://www.raoxia.com/?p=361</guid>
		<description><![CDATA[最近搬了新家之后，每天消耗在交通工具上的时间大大增加了。住在中关村的时候，到公司最多半小时；而现在起码也要一个小时，碰上清明等节日时候，耗费一个半小时也很常见。在这漫长的路程中，我总不能一直发呆看窗外吧。因此，最近几天我做了一个移动阅读应用——一端阅读，用来打发坐公交和地铁过程中的无聊。

  一端阅读的内容全部精选自各大社交网站（微博，人人，豆瓣等）的美文，其中以豆瓣上多人推荐的日记居多。另外，一端阅读还加入了很多名家的散文和短篇小说，例如周作人，沈从文，张爱玲，丰子恺，莫言等等。当然，如果有哪篇文章涉及到版权问题，或者作者不想在一端阅读上显示，请及时通知我，我将立刻撤除该文章。

  下载地址：http://www.1duan.com/app/41
  网页版本：http://www.1duan.com/reader
  
  也欢迎网友投稿或推荐文章，如果是转载的请注明出处。
  投稿地址：http://www.1duan.com/note/create]]></description>
				<content:encoded><![CDATA[<p>最近搬了新家之后，每天消耗在交通工具上的时间大大增加了。住在中关村的时候，到公司最多半小时；而现在起码也要一个小时，碰上清明等节日时候，耗费一个半小时也很常见。在这漫长的路程中，我总不能一直发呆看窗外吧。因此，最近几天我做了一个移动阅读应用——一端阅读，用来打发坐公交和地铁过程中的无聊。</p>
<p>  一端阅读的内容全部精选自各大社交网站（微博，人人，豆瓣等）的美文，其中以豆瓣上多人推荐的日记居多。另外，一端阅读还加入了很多名家的散文和短篇小说，例如周作人，沈从文，张爱玲，丰子恺，莫言等等。当然，如果有哪篇文章涉及到版权问题，或者作者不想在一端阅读上显示，请及时通知我，我将立刻撤除该文章。</p>
<p>  下载地址：http://www.1duan.com/app/41<br />
  网页版本：http://www.1duan.com/reader</p>
<p>  也欢迎网友投稿或推荐文章，如果是转载的请注明出处。<br />
  投稿地址：http://www.1duan.com/note/create</p>
]]></content:encoded>
			<wfw:commentRss>http://www.raoxia.com/%e4%b8%80%e7%ab%af%e9%98%85%e8%af%bb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iscroll.js 用法介绍</title>
		<link>http://www.raoxia.com/iscroll-js-%e7%94%a8%e6%b3%95%e4%bb%8b%e7%bb%8d/</link>
		<comments>http://www.raoxia.com/iscroll-js-%e7%94%a8%e6%b3%95%e4%bb%8b%e7%bb%8d/#respond</comments>
		<pubDate>Sat, 20 Apr 2013 15:08:56 +0000</pubDate>
		<dc:creator><![CDATA[admin]]></dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.raoxia.com/?p=359</guid>
		<description><![CDATA[iScroll 4 这个版本完全重写了iScroll这个框架的原始代码。这个项目的产生完全是因为移动版webkit浏览器（诸如iPhone，iPad，Android 这些系统上广泛使用）提供了一种本地化的方式来对一个限定了高度和宽度的元素的内容进行滑动。很不幸的是，这种情况下所有的web应用的页面就不能够包含具有position:absolute的头、页尾或者是一个内容可滚动的中间区域。
然而，Android系统最新修订版已经可以支持这种功能了（尽管支持的力度还不是特别好），Apple公司似乎不太情愿将one-finger滑动事件运用到div元素上。
除了以前版本的iScroll的特性以外，iScroll 4还包括如下的特性：
     （1）缩放（Pinch/Zoom）
    （2）拉动刷新（Pull up/down to refresh）
    （3）速度和性能提升
    （4）精确捕捉元素
    （5）自定义滚动条
      友情提示：iScroll 4并不是iScroll 3的简易替代版本，API文档已经不一样了。同时考虑到此版本正处于测试期，一些API
                          可能会有细微的变化。
使用指南
在此文档中你会发现很多例子来教会你如何快速上手iScroll脚本库。参看文中的demo小例子并仔细阅读此文档，可能有点小无聊，但是这篇文章中却是iScroll这个脚本库的精髓之所在哦。
iScroll需要对所要进行滚动的元素进行初始化，并且不限定一个页面中使用iScroll的元素的个数（这里不考虑您的硬件配置）。滚动元素中内容的类型和长度在一定程度上将会影响iScroll脚本库里可以同时使用的元素的个数。
使用iScroll这个脚本库时，DOM树的结构要足够简单，移除不必要的标签，尽量避免过多的标签嵌套使用。
最优的使用iScroll的结构如下所示：
<div id="wrapper">
        <ul>
               <li></li>
               .....
        </ul>
</div>
在这个小例子中，ul标签将会被滚动。iScroll一定要与滚动内容外面的wrapper进行联系才会产生效果。
【注意事项】：
只有wrapper里的第一个子元素才可以滚动，如果你想要更多的元素可以滚动，那么你可以试试下面的这种写法：
<div id="wrapper">
        <div id="scroller">
               <ul>
                    <li></li>
                     ...
                </ul>
                <ul>
                         <li></li>
                          ...
                </ul>
       </div>
</div>
在这个例子中，scroller这个元素可以滚动，即便它包含两个ul元素
iScroll必须在调用之前实例化，你可以在下面几种情况下对iScroll进行实例化：
    （1）onDOMContentLoaded
    （2）onLoad
    （3）以内联inline方式
下面我们逐个来讲讲这三种用法的优缺点
ONDOMContentLoaded
        适用于滚动内容只包含文字、图片，并且所有的图片都有固定的尺寸
        使用方法：（在head标签中添加如下代码）
        <script src="iscroll.js"></script>
        <script>
                 var myscroll;
                function loaded(){
                           myscroll=new iScroll("wrapper");
                 }
               window.addEventListener("DOMContentLoaded",loaded,false);
         </script>
         注意：myscroll这个变量是全局的，因此你可以在任何地方调用它的函数
onLoad
        有些时候在DOMContentLoaded的状态下就初始化iScroll其实是有点草率的，因此此时页面的资源可能还没有全部加载
        完毕。如果你遇到了一些很怪异的行为可以试试下面的写法：
        <script src="iscroll.js"><script>
        <script>
                    var myscroll;
                    function loaded(){
                   setTimeout(function(){
                            myscroll=new iScroll("wrapper");
                     }，100 );
                }
                window.addEventListener("load",loaded,false);
         </script>
         这种情况下iScroll会在页面资源（包括图片）加载完毕100ms之后得到初始化，这应该是一种比较安全的调用iScroll的
         方式。
inline初始化
         这种情况会在页面加载到js的时候就进行调用，此方法不推荐使用，但是很多javascript的大牛都在用这种方式，我又
         有什么理由不赞成呢？
         <script src="iscroll.js"></script>
                    <div id="wrapper">
                            <ul>
                                <li></li>
                                 ...
                          </ul>
                  </div>
        <script>
                   var myscroll=new iScroll("wrapper");
        </script>
        不过建议你使用一些框架的ready方法来安全调用iScroll（比如jquery里的ready()）。
iScroll里传递的参数
        iScroll里的第二个参数允许你自定义一些内容，比如下面的这段代码：
       <script>
                 var myscroll=new iScroll("wrapper",{hScrollbar:false, vScrollbar:false});
       </script>
       第二个参数通常都是一个对象，像上面的这个例子里就设定了不显示滚动条。常用的参数如下：
               hScroll               false 禁止横向滚动 true横向滚动 默认为true
               vScroll               false 精致垂直滚动 true垂直滚动 默认为true
               hScrollbar         false隐藏水平方向上的滚动条
               vScrollbar         false 隐藏垂直方向上的滚动条
               fixedScrollbar  在iOS系统上，当元素拖动超出了scroller的边界时，滚动条会收缩，设置为true可以禁止滚动条超出
                                        scroller的可见区域。默认在Android上为true， iOS上为false
               fadeScrollbar  false 指定在无渐隐效果时隐藏滚动条
               hideScrollbar  在没有用户交互时隐藏滚动条 默认为true
               bounce            启用或禁用边界的反弹，默认为true
               momentum     启用或禁用惯性，默认为true，此参数在你想要保存资源的时候非常有用
               lockDirection  false取消拖动方向的锁定， true拖动只能在一个方向上（up/down 或者left/right）
                为了保持资源的完整性，建议去除滚动条
拉动刷新（pull to refresh）
        自从Twitter和一些Apple的本地化应用出现了这个效果之后，这个效果就变得非常流行。你可以看看这儿先一睹为快。
       我最近把"pull to refresh"这个部分单分出来作为iScroll的一个额外插件。你可以点击这儿看看pull to refresh是如何工作
       滴。你只需要做的就是自定义pullDownAction()这个方法。你可能需要一个ajax来加载新的内容，不过一旦DOM树发生
        了变化要记得调用refresh这个方法来。需要记住的是在例子中我们加了1秒的延迟来模拟网络的延迟效果。当然，如果
        你不想使用这个延迟，那就把setTimeout方法去掉就行了。
缩放(pinch / zoom)
        我们不得不面对一个事实，那就是光有滚动其实没什么新意的。这就是为什么在iScroll 4这个版本里我们允许你可以放
        大和缩小。想要这个功能，只需要设置放大的参数zoom 为true即可实现利用手势来放大和缩小。你可以看看这儿。
        双击放大和缩小的功能在iScroll 4里也是得到支持的。要使用缩放功能，你至少需要如下配置：
                var myScroll =new iScroll("wrapper",{zoom:true});
       如果你想对缩放功能进行深度的自定义的话可以使用下面的一些选项：
               zoomMax   指定允许放大的最大倍数，默认为4
      【注意事项】：如果想要图片缩放的效果很好的话要把他们放到硬件的合成层中。通俗点说，就是在所有需要缩放的
                                 img元素上使用-webkit-transform:translate3d(0,0,0)来实现，而且尤为重要的是，硬件的加速会占用大量
                                 资源，要谨慎使用，否则你的应用可能就此崩溃。
捕捉元素（snap and snap to element）
        捕捉的功能会促使scroller去重新定义位置，这样可以制作更加花哨的传送带效果。点击这里有个小例子。
        默认情况下，iScroll将scroller分成四分体，或者是相同大小的wrapper。iScroll 4加入了这个属性允许捕捉scroller里的
        任何元素，不考虑外部wrapper的大小。如果你想要实现这样的传送带效果，我建议你使用“quadrant”分割。最佳的设
        置如下：
                 var myscroll=new iScroll("wrapper",{
                       snap:true,
                       momentum:false,
                       hScrollbar:false,
                       vScrollbar: false
                  });
          捕获元素，可以通过传递一个字符串来作为查询条件，如下：
                var myscroll=new iScroll("wrapper",{
                      snap:"li",
                      momentum:false,
                      hScrollbar:false,
                      vScrollbar:false
                });
           在这个例子中scroller可以捕捉到滚动区域中最左上角的li元素
自定义滚动条（custom scrollbars）
          在iScroll 4这个版本中，可以利用一系列的css来自定义滚动条的呈现。可以给滚动条添加一个class参数，如下：
                  var myscroll=new iScroll("wrapper",{
                     scrollbarClass: "myScrollbar"
                 });
          你可以点击这里看一个小例子，在这个小例子里，myScrollbarH这个类被添加到了水平滚动条上，myScrollbarV这个
          类则被添加给了垂直方向上的滚动条上了。需要提醒的是，滚动条是由两个元素组合而成的：容器和显示器。容器同
           wrapper的高度相同，而显示器则代表的是滚动条本身。
           滚动条的HTML结构如下：
                  <div class="myScrollbarV">
                          <div></div>
                  </div>
                 .myscrollbarV{
                           position:absolute;z-index:100;width:8px;bottom:7px;top:2px;right:1px;
                  }
                .myScrollbarV > div {
                           position:absolute;
                           z-index:100;
                           width:100%;
                             /* The following is probably what you want to customize */
                           background:-webkit-gradient(linear, 0 0, 100% 0, from(#f00), to(#900));
                           border:1px solid #800;
                          -webkit-background-clip:padding-box;
                          -webkit-box-sizing:border-box;
                          -webkit-border-radius:4px;
                          -webkit-box-shadow:inset 1px 1px 0 rgba(255,255,255,0.5);
                 }
通用方法：
     （1）refresh                          在DOM树发生变化时，应该调用此方法
     （2）scrollTo()                     滚动到某个位置（一般用这个方法比较合适）
               eg: myscroll.scrollTo(0,10,200,true);
     （3）scrollToElement()      滚动到某个元素（这个方法会将元素移动到目标滚动调元素的左上角）
               eg: myscroll.scrolToElement("li:nth-child(10)",100);
     （4）detroy()                       完全消除myscroll及其占用的内存空间
                eg: myscroll.destroy()

初始化iscroll时需要的注意事项：
1、onBeforeScrollStart，这个属性方法是在滚动前调用的方法，里面需要加入阻止元素默认行为的方法，否则在ipad上按钮、input框、色了传统框等均不能使用。具体如下：
onBeforeScrollStart: function (e) {
                   var target = e.target;
                   while (target.nodeType != 1) target = target.parentNode;
                   if (target.tagName != 'SELECT' &#038;& target.tagName != 'INPUT' &#038;& target.tagName != 'TEXTAREA')
                       e.preventDefault();
               }
2、checkDOMChanges，这个属性是控制界面结构dom元素发生变化的方法，默认为false。如果设置为true可以控制页面结构完整不出现偏移。]]></description>
				<content:encoded><![CDATA[<p>iScroll 4 这个版本完全重写了iScroll这个框架的原始代码。这个项目的产生完全是因为移动版webkit浏览器（诸如iPhone，iPad，Android 这些系统上广泛使用）提供了一种本地化的方式来对一个限定了高度和宽度的元素的内容进行滑动。很不幸的是，这种情况下所有的web应用的页面就不能够包含具有position:absolute的头、页尾或者是一个内容可滚动的中间区域。<br />
然而，Android系统最新修订版已经可以支持这种功能了（尽管支持的力度还不是特别好），Apple公司似乎不太情愿将one-finger滑动事件运用到div元素上。<br />
除了以前版本的iScroll的特性以外，iScroll 4还包括如下的特性：<br />
     （1）缩放（Pinch/Zoom）<br />
    （2）拉动刷新（Pull up/down to refresh）<br />
    （3）速度和性能提升<br />
    （4）精确捕捉元素<br />
    （5）自定义滚动条<br />
      友情提示：iScroll 4并不是iScroll 3的简易替代版本，API文档已经不一样了。同时考虑到此版本正处于测试期，一些API<br />
                          可能会有细微的变化。<br />
使用指南<br />
在此文档中你会发现很多例子来教会你如何快速上手iScroll脚本库。参看文中的demo小例子并仔细阅读此文档，可能有点小无聊，但是这篇文章中却是iScroll这个脚本库的精髓之所在哦。<br />
iScroll需要对所要进行滚动的元素进行初始化，并且不限定一个页面中使用iScroll的元素的个数（这里不考虑您的硬件配置）。滚动元素中内容的类型和长度在一定程度上将会影响iScroll脚本库里可以同时使用的元素的个数。<br />
使用iScroll这个脚本库时，DOM树的结构要足够简单，移除不必要的标签，尽量避免过多的标签嵌套使用。<br />
最优的使用iScroll的结构如下所示：</p>
<div id="wrapper">
<ul>
<li></li>
<p>               &#8230;..
        </ul>
</div>
<p>在这个小例子中，ul标签将会被滚动。iScroll一定要与滚动内容外面的wrapper进行联系才会产生效果。<br />
【注意事项】：<br />
只有wrapper里的第一个子元素才可以滚动，如果你想要更多的元素可以滚动，那么你可以试试下面的这种写法：</p>
<div id="wrapper">
<div id="scroller">
<ul>
<li></li>
<p>                     &#8230;
                </ul>
<ul>
<li></li>
<p>                          &#8230;
                </ul>
</p></div>
</div>
<p>在这个例子中，scroller这个元素可以滚动，即便它包含两个ul元素<br />
iScroll必须在调用之前实例化，你可以在下面几种情况下对iScroll进行实例化：<br />
    （1）onDOMContentLoaded<br />
    （2）onLoad<br />
    （3）以内联inline方式<br />
下面我们逐个来讲讲这三种用法的优缺点<br />
ONDOMContentLoaded<br />
        适用于滚动内容只包含文字、图片，并且所有的图片都有固定的尺寸<br />
        使用方法：（在head标签中添加如下代码）<br />
        <script src="iscroll.js"></script><br />
        <script>
                 var myscroll;
                function loaded(){
                           myscroll=new iScroll("wrapper");
                 }
               window.addEventListener("DOMContentLoaded",loaded,false);
         </script><br />
         注意：myscroll这个变量是全局的，因此你可以在任何地方调用它的函数<br />
onLoad<br />
        有些时候在DOMContentLoaded的状态下就初始化iScroll其实是有点草率的，因此此时页面的资源可能还没有全部加载<br />
        完毕。如果你遇到了一些很怪异的行为可以试试下面的写法：<br />
        <script src="iscroll.js"><script>
        <script>
                    var myscroll;
                    function loaded(){
                   setTimeout(function(){
                            myscroll=new iScroll("wrapper");
                     }，100 );
                }
                window.addEventListener("load",loaded,false);
         </script><br />
         这种情况下iScroll会在页面资源（包括图片）加载完毕100ms之后得到初始化，这应该是一种比较安全的调用iScroll的<br />
         方式。<br />
inline初始化<br />
         这种情况会在页面加载到js的时候就进行调用，此方法不推荐使用，但是很多javascript的大牛都在用这种方式，我又<br />
         有什么理由不赞成呢？<br />
         <script src="iscroll.js"></script></p>
<div id="wrapper">
<ul>
<li></li>
<p>                                 ...
                          </ul>
</p></div>
<p>        <script>
                   var myscroll=new iScroll("wrapper");
        </script><br />
        不过建议你使用一些框架的ready方法来安全调用iScroll（比如jquery里的ready()）。<br />
iScroll里传递的参数<br />
        iScroll里的第二个参数允许你自定义一些内容，比如下面的这段代码：<br />
       <script>
                 var myscroll=new iScroll("wrapper",{hScrollbar:false, vScrollbar:false});
       </script><br />
       第二个参数通常都是一个对象，像上面的这个例子里就设定了不显示滚动条。常用的参数如下：<br />
               hScroll               false 禁止横向滚动 true横向滚动 默认为true<br />
               vScroll               false 精致垂直滚动 true垂直滚动 默认为true<br />
               hScrollbar         false隐藏水平方向上的滚动条<br />
               vScrollbar         false 隐藏垂直方向上的滚动条<br />
               fixedScrollbar  在iOS系统上，当元素拖动超出了scroller的边界时，滚动条会收缩，设置为true可以禁止滚动条超出<br />
                                        scroller的可见区域。默认在Android上为true， iOS上为false<br />
               fadeScrollbar  false 指定在无渐隐效果时隐藏滚动条<br />
               hideScrollbar  在没有用户交互时隐藏滚动条 默认为true<br />
               bounce            启用或禁用边界的反弹，默认为true<br />
               momentum     启用或禁用惯性，默认为true，此参数在你想要保存资源的时候非常有用<br />
               lockDirection  false取消拖动方向的锁定， true拖动只能在一个方向上（up/down 或者left/right）<br />
                为了保持资源的完整性，建议去除滚动条<br />
拉动刷新（pull to refresh）<br />
        自从Twitter和一些Apple的本地化应用出现了这个效果之后，这个效果就变得非常流行。你可以看看这儿先一睹为快。<br />
       我最近把"pull to refresh"这个部分单分出来作为iScroll的一个额外插件。你可以点击这儿看看pull to refresh是如何工作<br />
       滴。你只需要做的就是自定义pullDownAction()这个方法。你可能需要一个ajax来加载新的内容，不过一旦DOM树发生<br />
        了变化要记得调用refresh这个方法来。需要记住的是在例子中我们加了1秒的延迟来模拟网络的延迟效果。当然，如果<br />
        你不想使用这个延迟，那就把setTimeout方法去掉就行了。<br />
缩放(pinch / zoom)<br />
        我们不得不面对一个事实，那就是光有滚动其实没什么新意的。这就是为什么在iScroll 4这个版本里我们允许你可以放<br />
        大和缩小。想要这个功能，只需要设置放大的参数zoom 为true即可实现利用手势来放大和缩小。你可以看看这儿。<br />
        双击放大和缩小的功能在iScroll 4里也是得到支持的。要使用缩放功能，你至少需要如下配置：<br />
                var myScroll =new iScroll("wrapper",{zoom:true});<br />
       如果你想对缩放功能进行深度的自定义的话可以使用下面的一些选项：<br />
               zoomMax   指定允许放大的最大倍数，默认为4<br />
      【注意事项】：如果想要图片缩放的效果很好的话要把他们放到硬件的合成层中。通俗点说，就是在所有需要缩放的<br />
                                 img元素上使用-webkit-transform:translate3d(0,0,0)来实现，而且尤为重要的是，硬件的加速会占用大量<br />
                                 资源，要谨慎使用，否则你的应用可能就此崩溃。<br />
捕捉元素（snap and snap to element）<br />
        捕捉的功能会促使scroller去重新定义位置，这样可以制作更加花哨的传送带效果。点击这里有个小例子。<br />
        默认情况下，iScroll将scroller分成四分体，或者是相同大小的wrapper。iScroll 4加入了这个属性允许捕捉scroller里的<br />
        任何元素，不考虑外部wrapper的大小。如果你想要实现这样的传送带效果，我建议你使用“quadrant”分割。最佳的设<br />
        置如下：<br />
                 var myscroll=new iScroll("wrapper",{<br />
                       snap:true,<br />
                       momentum:false,<br />
                       hScrollbar:false,<br />
                       vScrollbar: false<br />
                  });<br />
          捕获元素，可以通过传递一个字符串来作为查询条件，如下：<br />
                var myscroll=new iScroll("wrapper",{<br />
                      snap:"li",<br />
                      momentum:false,<br />
                      hScrollbar:false,<br />
                      vScrollbar:false<br />
                });<br />
           在这个例子中scroller可以捕捉到滚动区域中最左上角的li元素<br />
自定义滚动条（custom scrollbars）<br />
          在iScroll 4这个版本中，可以利用一系列的css来自定义滚动条的呈现。可以给滚动条添加一个class参数，如下：<br />
                  var myscroll=new iScroll("wrapper",{<br />
                     scrollbarClass: "myScrollbar"<br />
                 });<br />
          你可以点击这里看一个小例子，在这个小例子里，myScrollbarH这个类被添加到了水平滚动条上，myScrollbarV这个<br />
          类则被添加给了垂直方向上的滚动条上了。需要提醒的是，滚动条是由两个元素组合而成的：容器和显示器。容器同<br />
           wrapper的高度相同，而显示器则代表的是滚动条本身。<br />
           滚动条的HTML结构如下：</p>
<div class="myScrollbarV">
<div></div>
</p></div>
<p>                 .myscrollbarV{<br />
                           position:absolute;z-index:100;width:8px;bottom:7px;top:2px;right:1px;<br />
                  }<br />
                .myScrollbarV > div {<br />
                           position:absolute;<br />
                           z-index:100;<br />
                           width:100%;<br />
                             /* The following is probably what you want to customize */<br />
                           background:-webkit-gradient(linear, 0 0, 100% 0, from(#f00), to(#900));<br />
                           border:1px solid #800;<br />
                          -webkit-background-clip:padding-box;<br />
                          -webkit-box-sizing:border-box;<br />
                          -webkit-border-radius:4px;<br />
                          -webkit-box-shadow:inset 1px 1px 0 rgba(255,255,255,0.5);<br />
                 }<br />
通用方法：<br />
     （1）refresh                          在DOM树发生变化时，应该调用此方法<br />
     （2）scrollTo()                     滚动到某个位置（一般用这个方法比较合适）<br />
               eg: myscroll.scrollTo(0,10,200,true);<br />
     （3）scrollToElement()      滚动到某个元素（这个方法会将元素移动到目标滚动调元素的左上角）<br />
               eg: myscroll.scrolToElement("li:nth-child(10)",100);<br />
     （4）detroy()                       完全消除myscroll及其占用的内存空间<br />
                eg: myscroll.destroy()</p>
<p>初始化iscroll时需要的注意事项：<br />
1、onBeforeScrollStart，这个属性方法是在滚动前调用的方法，里面需要加入阻止元素默认行为的方法，否则在ipad上按钮、input框、色了传统框等均不能使用。具体如下：<br />
onBeforeScrollStart: function (e) {<br />
                   var target = e.target;<br />
                   while (target.nodeType != 1) target = target.parentNode;<br />
                   if (target.tagName != 'SELECT' && target.tagName != 'INPUT' && target.tagName != 'TEXTAREA')<br />
                       e.preventDefault();<br />
               }<br />
2、checkDOMChanges，这个属性是控制界面结构dom元素发生变化的方法，默认为false。如果设置为true可以控制页面结构完整不出现偏移。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.raoxia.com/iscroll-js-%e7%94%a8%e6%b3%95%e4%bb%8b%e7%bb%8d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
