<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="http://feeds.qzone.qq.com/rss.xsl" version="1.0"?>
<rss version="2.0" xmlns:qz="http://qzone.qq.com">
<channel>
<title><![CDATA[燕子李三]]></title>
<description><![CDATA[三言两语 · San's qzone]]></description>
<link>http://29583894.qzone.qq.com</link>
<lastBuildDate>Sun, 29 Nov 2009 04:30:52 GMT</lastBuildDate>
<generator>Qzone</generator>
<language>zh-cn</language>
<copyright>Copyright (C), 2005-2008, Tencent Tech. Co., Ltd.</copyright>
<pubDate>Mon, 26 Oct 2009 02:32:29 GMT</pubDate>

<item>
<title><![CDATA[[转]javaScript的一道面试题]]></title>
<link>http://29583894.qzone.qq.com/blog/1256524349</link>
<description><![CDATA[&lt;script type=&quot;text/javascript&quot;&gt; <br>var x = 1; <br>var y = 0; <br>var z = 0; <br>function add(n){n=n+1;} <br>y = add(x); <br>function add(n){n=n+3;} <br>z = add(x); <br>s=y+z;<br>&lt;/script&gt;<br><br>求：<br>y的值是？<br>z 的值是？<br>s的值是？<br><br>我相信，肯定有同学会答错，当然，不是说他们不会，而是他们可能太大意了！<br><br>我们首先看function add，两个add都没有返回值，而我们知道，没有明确返回值的，全部返回undefined，所以，y和z都会是undefined，那么s自然也就不会是一个数字了，没错，s应该是NaN。<br><br>假如我们将题目改一下呢？如下：<br>&lt;script type=&quot;text/javascript&quot;&gt; <br>var x = 1; <br>var y = 0; <br>var z = 0; <br>function add(n){return n=n+1;} <br>y = add(x); <br>function add(n){return n=n+3;} <br>z = add(x); <br>s=y+z;<br>&lt;/script&gt;<br><br>两个function add都有返回值了，那么，y,z,s会是多少呢？<br>不错，y和z都是4，s是8，为什么y不是2而是4呢？因为在javascript中，直接通过function申明的函数，后面定义的，会影响到之前的引用，如下：<br><br>&lt;script type=&quot;text/javascript&quot;&gt;<br>function x(){alert(2)};<br>x();//output 3<br>function x(){alert(3)};<br>x();//output 3<br>&lt;/script&gt;<br><br>如果是通过var来申明的函数会是什么情况呢？我们看看：<br><br>&lt;script type=&quot;text/javascript&quot;&gt;<br>var x = function(){alert(0)};<br>x();//output 0<br>var x=function(){alert(1)};<br>x();//output 1<br>x();//output 1<br>&lt;/script&gt;<br><br>通过var申明的函数，后面定义的并不会影响前面的引用。<br><br>如果两种模式混合，又会是什么情况呢？<br><br>&lt;script type=&quot;text/javascript&quot;&gt;<br>function x(){alert(2)};<br>x();//output 3<br>var x = function(){alert(0)};<br>x();//output 0<br>var x=function(){alert(1)};<br>x();//output 1<br>function x(){alert(3)};<br>x();//output 1<br>&lt;/script&gt;<br><br>结果是这样的，你猜到了吗？<br><br>通过function定义的函数，后面定义的，照旧影响了前面的引用，但是不能改变通过var申明函数后的引用，反而，通过var申明的函数，改变了后来通过function申明函数之后的引用。<br><br>所以，如果：<br>&lt;script type=&quot;text/javascript&quot;&gt;<br>var x=function(){alert(1)};<br>x();<br>function x(){alert(3)};<br>x();<br>&lt;/script&gt;<br>后面的x()出来的也会是1。 <br> <!--v:3.2--> ]]></description>
<category><![CDATA[个人日记]]></category>
<author><![CDATA[29583894@qq.com(燕子李三)]]></author>
<comments>http://29583894.qzone.qq.com/blog/1256524349#comment</comments>
<qz:effect>134218248</qz:effect>
<pubDate>Mon, 26 Oct 2009 02:32:29 GMT</pubDate>
<guid>http://29583894.qzone.qq.com/blog/1256524349</guid>
</item>

<item>
<title><![CDATA[多网卡优先级的设置]]></title>
<link>http://29583894.qzone.qq.com/blog/1255790412</link>
<description><![CDATA[<br>　　在家使用本本，有时离无线路由远一些信号就会比较弱，常常要接上网线才能保证网速。有线连接还是要比无线连接更稳定一些，但在默认情况下，Windows会优先使用无线连接。打开“网络连接”文件夹后，选择“高级”－》“高级设置”，在“连接按被网络服务访问的顺序排列”下选中相应的网卡，单击右侧向上或向下的按钮即可设置网卡的优先级。Windows将会按从上到下的顺序来尝试使用这些连接。有了这个功能后，就可以设置为优先使用有线连接，因为它的连接速度最稳定也最快。 <div style="text-align:center;"><wbr /><a href="http://b24.photo.store.qq.com/http_imgload.cgi?/rurl4_b=8cc19266a1e3563cab0989d39582bd2cfe09e9ddc68cbfb3854de2d539af6d19784545307307465539ddb56d5b38654ca49aebac50bb6c55513f272734452b99c4069544169fc42604f511d9564c218a9ab21864&amp;a=25&amp;b=24" target="_blank"><img style="width:481px;height:248px;border:0;" src="http://b24.photo.store.qq.com/http_imgload.cgi?/rurl4_b=8cc19266a1e3563cab0989d39582bd2cfe09e9ddc68cbfb3854de2d539af6d19784545307307465539ddb56d5b38654ca49aebac50bb6c55513f272734452b99c4069544169fc42604f511d9564c218a9ab21864&amp;a=25&amp;b=24" /></a><wbr /></div><br><br><div style="text-align:center;"><wbr /><a href="http://b25.photo.store.qq.com/http_imgload.cgi?/rurl4_b=8cc19266a1e3563cab0989d39582bd2c99f3eb1b001be2682b30433e0c3bdae435e1dada0749e6ebc1897b906c77ff9a148754d34887d8035cd891d844f587843cb18db2a99b4f1ffce4e1bb07be5f71dc9b7a28&amp;a=25&amp;b=25" target="_blank"><img style="width:404px;height:443px;border:0;" src="http://b25.photo.store.qq.com/http_imgload.cgi?/rurl4_b=8cc19266a1e3563cab0989d39582bd2c99f3eb1b001be2682b30433e0c3bdae435e1dada0749e6ebc1897b906c77ff9a148754d34887d8035cd891d844f587843cb18db2a99b4f1ffce4e1bb07be5f71dc9b7a28&amp;a=25&amp;b=25" /></a><wbr /></div><br> <!--v:3.2--> ]]></description>
<category><![CDATA[技术]]></category>
<author><![CDATA[29583894@qq.com(燕子李三)]]></author>
<comments>http://29583894.qzone.qq.com/blog/1255790412#comment</comments>
<qz:effect>134218241</qz:effect>
<pubDate>Sat, 17 Oct 2009 14:40:12 GMT</pubDate>
<guid>http://29583894.qzone.qq.com/blog/1255790412</guid>
</item>

<item>
<title><![CDATA[function、arguments及函数式编程]]></title>
<link>http://29583894.qzone.qq.com/blog/1255780414</link>
<description><![CDATA[<br><span style="font-weight:bold"><wbr />　　arguments</span><wbr />是一个类似数组但不是数组的对象，说它类似(仅仅是类似)数组是因为其具有数组一样的访问性质及方式，可以由 arguments[n]来访问对应的单个参数的值，并拥有数组长度属性length。还有就是arguments对象存储的是实际传递给函数的参数，而不局限于函数声明所定义的参数列表(用funcName.length取)，而且不能显式创建 arguments 对象。arguments 对象只有函数开始时才可用。<br><br><span style="color:#000000;line-height:1.8em;">// caller demo<br>function callerDemo() {<br>    if (callerDemo.caller) {<br>        var a= callerDemo.caller.toString();<br>        alert(a);<br>    } else {<br>        alert(&quot;this is a top function&quot;);<br>    }<br>}<br>function handleCaller() {<br>    callerDemo();<br>}</span><wbr /><br> <br><span style="font-weight:bold"><wbr /><span style="font-size:18px;line-height:1.8em;">caller　</span><wbr /></span><wbr />返回一个对函数的引用，该函数调用了当前函数。<br>functionName.caller <br>functionName 对象是所执行函数的名称。<br>说明<br>　　对于函数来说，caller 属性只有在函数执行时才有定义。如果函数是由顶层调用的，那么 caller 包含的就是 null 。如果在字符串上下文中使用 caller 属性，那么结果和 functionName.toString 一样，也就是说，显示的是函数的反编译文本。<br> <br><br><br><br><span style="font-weight:bold"><wbr /><span style="font-size:18px;line-height:1.8em;">callee　</span><wbr /></span><wbr />返回正被执行的 Function 对象，也就是所指定的 Function 对象的正文。<br>[function.]arguments.callee<br>可选项 function 参数是当前正在执行的 Function 对象的名称。<br>说明<br>　　callee 属性的初始值就是正被执行的 Function 对象。<br>　　callee 属性是 arguments 对象的一个成员，它表示对函数对象本身的引用，这有利于匿名函数的递归或者保证函数的封装性，例如下边示例的递归计算1到n的自然数之和。而该属性仅当相关函数正在执行时才可用。还有需要注意的是callee拥有length属性，这个属性有时候用于验证还是比较好的。arguments.length是实参长度，arguments.callee.length是形参长度，由此可以判断调用时形参长度是否和实参长度一致。<br><br>//callee可以打印其本身<br>function calleeDemo() {<br>    alert(arguments.callee);<br>}<br>//用于验证参数<br>function calleeLengthDemo(arg1, arg2) {<br>    if (arguments.length==arguments.callee.length) {<br>        window.alert(&quot;验证形参和实参长度正确！&quot;);<br>        return;<br>    } else {<br>        alert(&quot;实参长度：&quot; +arguments.length);<br>        alert(&quot;形参长度： &quot; +arguments.callee.length);<br>    }<br>}<br>//递归计算<br>var sum = function(n){<br>if (n &lt;= 0)                        <br>return 1;<br>else<br>    return n ＋arguments.callee(n - 1)<br>}<br>比较一般的递归函数：<br>var sum = function(n){<br>    if (1==n) return 1;<br>else return n + sum (n-1);<br>调用时：alert(sum(100));<br><br><br><span style="font-size:18px;line-height:1.8em;"><span style="font-weight:bold"><wbr />apply and call</span><wbr /></span><wbr /><br>　　它们的作用都是将函数绑定到另外一个对象上去运行，两者仅在定义参数方式有所区别：<br>　　apply(thisArg,argArray);<br>　　call(thisArg[,arg1,arg2…] ]);<br>　　即所有函数内部的this指针都会被赋值为thisArg，这可实现将函数作为另外一个对象的方法运行的目的。<br>apply的说明<br>　　如果 argArray 不是一对个有效的数组或者不是 arguments 象，那么将导致一个 TypeError。<br>　　如果没有提供 argArray 和 thisArg任何一个参数，那么 Global 对象将被用作 thisArg，并且无法被传递任何参数。<br>call的说明<br>　　call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisArg指定的新对象。<br>　　如果没有提供 thisArg参数，那么 Global 对象被用作 thisArg。<br>相关技巧<br>　　应用call和apply还有一个技巧在里面，就是用call和apply应用另一个函数（类）以后，当前的函数（类）就具备了另一个函数（类）的方法或者是属性，这也可以称之为“继承”。看下面示例：<br> <br>// 继承的演示<br>function base() {<br>    this.member = &quot; dnnsun_Member&quot;;<br>    this.method = function() {<br>        window.alert(this.member);<br>    }<br>}<br>function extend() {<br>    base.call(this);<br>    window.alert(member);<br>    window.alert(this.method);<br>}<br><br>上面的例子可以看出，通过call之后，extend可以继承到base的方法和属性。 <br>顺便提一下，在javascript框架prototype里就使用apply来创建一个定义类的模式，其实现代码如下：<br>var Class = {<br>    create: function() {<br>        return function() {<br>            this.initialize.apply(this, arguments);<br>        }<br>    }<br>}<br>解析：从代码看,该对象仅包含一个方法：Create，其返回一个函数，即类。但这也同时是类的构造函数，其中调用initialize，而这个方法是在类创建时定义的初始化函数。通过如此途径，就可以实现prototype中的类创建模式。<br>示例：<br>var vehicle=Class.create();<br>vehicle.prototype={<br>    initialize:function(type){<br>        this.type=type;<br>    }<br>    showSelf:function(){<br>        alert(&quot;this vehicle is &quot;+ this.type);<br>    }<br>}<br>var moto=new vehicle(&quot;Moto&quot;);<br>moto.showSelf();<br>其中函数内部包含了对sum自身的引用，函数名仅仅是一个变量名，在函数内部调用sum即相当于调用一个全局变量，不能很好的体现出是调用自身，这时使用callee会是一个比较好的方法。<br><br>下面对 JavaScript 中的函数式风格作一快速总结：<span style="text-decoration:underline;"><wbr /><li style="margin:25px;">函数并不总是需要名称。 <li style="margin:25px;">函数可以像其他值一样分配给变量。 <li style="margin:25px;">函数表达式可以编写并放在括号中，留待以后应用。 <li style="margin:25px;">函数可以作为参数传递给其他函数。 </li></span><wbr /><br>1,最基础的写函数的风格<br>function sum(x,y,z) {<br>    return (x+y+z);<br>}<br>2,匿名函数<br>function(x,y,z) {<br>    return (x+y+z);<br>}<br>3,函数变量<br>var sum = function(x,y,z) {<br>    return (x+y+z);<br>}(1,2,3);<br>alert(sum);<br>4,函数表达式<br>(alert) (“Hello, World!&quot;);<br>5,函数的立即调用<br>(function(x,y,z) { return (x+y+z) }) (1, 2, 3);<br>以上是几种函数的书写风格.另外,声明一个函数还可以用<br>var func=new function(arg1,arg2,arg3,funcbody);<br>来进行函数声明.<br><br>函数式编程示例：<br>//动态生成 HTML 的优美代码<br>//生成动态 HTML 的普通代码<br>var str=' ';<br>for (var i=0;i&lt;arr.length;i++) {<br>    var element=arr<span style="font-style:italic"><wbr />;<br>    str+= HTML generation code<br>}<br>document.write(str);<br>//生成动态 HTML 的通用方式            <br>Array.prototype.fold=function(templateFn) {<br>var len=this.length;<br>var str=' ';<br>for (var i=0 ; i&lt;len ; i++) <br>    str+=templateFn(this<span style="font-style:italic"><wbr />);<br>return str;<br>}<br>function templateInstance(element) {<br>    return HTML generation code <br>}<br>document.write(arr.fold(templateInstance));<br><br>//系列函数的应用<br>//在回调中调用一组函数<br>window.setTimeout(function(){alert(‘First!’);alert(‘Second!’);}, 5000);<br>//调用系列函数的更好的方式<br>Function.prototype.sequence=function(g) {<br>    var f=this;<br>    return function() {<br>        f();g();<br>    }<br>};<br>function alertFrst() { alert(‘First!’); }<br>function alertSec() { alert(‘Second!’); }<br>setTimeout( alertFrst.sequence(alertSec), 5000); <!--v:3.2--> ]]></description>
<category><![CDATA[技术]]></category>
<author><![CDATA[29583894@qq.com(燕子李三)]]></author>
<comments>http://29583894.qzone.qq.com/blog/1255780414#comment</comments>
<qz:effect>134218240</qz:effect>
<pubDate>Sat, 17 Oct 2009 11:53:34 GMT</pubDate>
<guid>http://29583894.qzone.qq.com/blog/1255780414</guid>
</item>

<item>
<title><![CDATA[eWebEditor与IE7,IE8不兼容的解决办法]]></title>
<link>http://29583894.qzone.qq.com/blog/1254918158</link>
<description><![CDATA[<span style="font-weight:bold"><wbr />解决方法</span><wbr /><br>打开Include/editor.js文件，找到如下语句：<br>if (element.YUSERONCLICK) eval(element.YUSERONCLICK + &quot;anonymous()&quot;);<br>修改成：<br>if (navigator.appVersion.match(/8./i)=='8.'||navigator.appVersion.match(/7./i)=='7.') {<br>   if(element.YUSERONCLICK) eval(element.YUSERONCLICK + &quot;onclick(event)&quot;);<br>} else { <br>   if(element.YUSERONCLICK) eval(element.YUSERONCLICK + &quot;anonymous()&quot;);<br>}<br>原因：IE8不支持anonymous()，所以要换成onclick(event)。按照上述方法进行修改，可使eWebEditor在IE7/8上正常使用。 <!--v:3.2--> ]]></description>
<category><![CDATA[技术]]></category>
<author><![CDATA[29583894@qq.com(燕子李三)]]></author>
<comments>http://29583894.qzone.qq.com/blog/1254918158#comment</comments>
<qz:effect>134218240</qz:effect>
<pubDate>Wed, 07 Oct 2009 12:22:38 GMT</pubDate>
<guid>http://29583894.qzone.qq.com/blog/1254918158</guid>
</item>

<item>
<title><![CDATA[收到骗子的转帐短信后，先别忙着删除]]></title>
<link>http://29583894.qzone.qq.com/blog/1252998074</link>
<description><![CDATA[<span style="font-family:'Verdana';line-height:1.8em;">对付骗子转帐短信的又一招: <br><br>1.收到骗子的短信后先别忙着删除,看看他的卡号是什么银行的,并登陆此银行的网上营业厅； <br><br>2.输入该骗子的卡号,密码随便填写,只要3次错误,此卡在24小时之间是不能进行任何的交易了(就是被冻结了)； <br><br>呵呵,他就的等吧,你看他不爽就天天给他来3次,叫他在骗人,哈哈! 请各位发到其他论坛和各种QQ群~让坏人无法得逞！！！  <br><br>如果运气超级好,密码对了,请你把钱转到红十字会给灾区献爱心!  </span><wbr /> <!--v:3.2--> ]]></description>
<category><![CDATA[杂侃]]></category>
<author><![CDATA[29583894@qq.com(燕子李三)]]></author>
<comments>http://29583894.qzone.qq.com/blog/1252998074#comment</comments>
<qz:effect>134218240</qz:effect>
<pubDate>Tue, 15 Sep 2009 07:01:14 GMT</pubDate>
<guid>http://29583894.qzone.qq.com/blog/1252998074</guid>
</item>

<item>
<title><![CDATA[Flash+ASP在线拍照功能优化开源]]></title>
<link>http://29583894.qzone.qq.com/blog/1252765630</link>
<description><![CDATA[　　由于最近的Web开发项目的需要，要用到网页控制摄像头拍照并上传保存到服务器的功能。百度到的可用内容实在太少，经过几天的研究，终于实现，现把ASP部分代码公开，以方便后来之人。（由于本人并不懂Flash编程，所以只能提供本人找到的SWF文件，本人也没有此源文件，所以请不要向我索要，想要的话可以自己下载我提供的SWF文件自己用URL Action Editor打开研究或是修改使用。）<br> <span style="color:#cccccc;line-height:1.8em;">原创内容,转载请注明出处:<a href="http://user.qzone.qq.com/29583894/blog/1252765630" target="_blank"><span style="color:#cccccc;line-height:1.8em;">http://user.qzone.qq.com/29583894/blog/1252765630</span><wbr /></a><wbr /></span><wbr /><br><div style="text-align:center;"><embed invokeURLs="false" allowNetworking="internal" allowscriptaccess="never" menu="false" id="flash0" width="420" height="340" src="http://test.ns2.sifang.info/san/makepic_unlock_edit2.swf" /></div><div style="text-align:center;">（由于QQ空间限制，此处的Flash不会被跨域提交，拍照后不能转到保存页，在实际应用中是可以的）</div>Flash文件地址：<a href="http://test.ns2.sifang.info/san/makepic_unlock_edit2.swf" target="_blank">http://test.ns2.sifang.info/san/makepic_unlock_edit2.swf</a><wbr /><br>调用方法：<br>&lt;object classid=&quot;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&quot; codebase=&quot;http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0&quot; width=&quot;420&quot; height=&quot;340&quot; id=&quot;makepic&quot; align=&quot;middle&quot;&gt;<br>  &lt;param name=&quot;allowScriptAccess&quot; value=&quot;sameDomain&quot; /&gt;<br>  &lt;param name=&quot;movie&quot; value=&quot;makepic_unlock_edit2.swf&quot; /&gt;<br>  &lt;param name=&quot;quality&quot; value=&quot;high&quot; /&gt;<br>  &lt;param name=&quot;bgcolor&quot; value=&quot;#ffffff&quot; /&gt;<br>  &lt;embed src=&quot;makepic_unlock_edit2.swf&quot; quality=&quot;high&quot; bgcolor=&quot;#ffffff&quot; width=&quot;420&quot; height=&quot;340&quot; name=&quot;example1&quot; align=&quot;middle&quot; allowScriptAccess=&quot;sameDomain&quot; type=&quot;application/x-shockwave-flash&quot; pluginspage=&quot;http://www.macromedia.com/go/getflashplayer&quot; /&gt;<br>&lt;/object&gt;<br><br> GetCamera2Jpeg.asp<br>&lt;%<br>Dim conn, strNow<br>Dim intTotalLine, strHeadData, strVarData, strSaveData, intLoop1, intLoop2, strTempData<br>strNow = Replace(Replace(Replace(Now(), &quot;:&quot;, &quot;&quot;), &quot;-&quot;, &quot;&quot;), &quot; &quot;, &quot;&quot;)<br><span style="color:#339933;line-height:1.8em;">'390*290*24 BMP头信息,关于BMP图像文件格式请参考</span><wbr /><a href="http://user.qzone.qq.com/29583894/blog/1252763701" target="_blank">BMP位图文件结构</a><wbr /><br>strHeadData = ChrB(66) &amp; ChrB(77) &amp; ChrB(222) &amp; ChrB(47) &amp; ChrB(5) &amp; ChrB(0) &amp; ChrB(0) &amp; ChrB(0) &amp;_<br>              ChrB(0) &amp; ChrB(0) &amp; ChrB(54) &amp; ChrB(0) &amp; ChrB(0) &amp; ChrB(0) &amp; ChrB(40) &amp; ChrB(0) &amp;_<br>              ChrB(0) &amp; ChrB(0) &amp; ChrB(134) &amp; ChrB(1) &amp; ChrB(0) &amp; ChrB(0) &amp; ChrB(34) &amp; ChrB(1) &amp;_<br>              ChrB(0) &amp; ChrB(0) &amp; ChrB(1) &amp; ChrB(0) &amp; ChrB(24) &amp; ChrB(0) &amp; ChrB(0) &amp; ChrB(0) &amp;_<br>              ChrB(0) &amp; ChrB(0) &amp; ChrB(168) &amp; ChrB(47) &amp; ChrB(5) &amp; ChrB(0) &amp; ChrB(0) &amp; ChrB(0) &amp;_<br>              ChrB(0) &amp; ChrB(0) &amp; ChrB(0) &amp; ChrB(0) &amp; ChrB(0) &amp; ChrB(0) &amp; ChrB(0) &amp; ChrB(0) &amp;_<br>              ChrB(0) &amp; ChrB(0) &amp; ChrB(0) &amp; ChrB(0) &amp; ChrB(0) &amp; ChrB(0)intTotalLine = Request.Form.Count<br>For intLoop1 = intTotalLine - 20 To 0 Step -1<br>   strTempData = Request.Form(&quot;PX&quot; &amp; intLoop1)<br>   strTempData = Split(strTempData, &quot;,&quot;)<br>   strVarData = &quot;&quot;<br>   For intLoop2 = 0 To UBound(strTempData)<br>      strVarData = strVarData &amp; To3(strTempData(intLoop2))   Next<br>   For intLoop2 = 1 To 4 - ((UBound(strTempData)+1) Mod 4)<br>      strVarData = strVarData &amp; ChrB(0)<br>   Next   strSaveData = strSaveData &amp; strVarData   <span style="color:#339933;line-height:1.8em;">'使用中间变量strVarData以减少对超长变量的重复访问可明显改善代码性能</span><wbr /><br>Next<br>strSaveData = strHeadData &amp; strSaveDataSet Conn = Server.CreateObject(&quot;Adodb.Connection&quot;)<br>Conn.ConnectionString = &quot;Provider=Microsoft.Jet.OLEDB.4.0; Data Source=&quot; &amp; Server.MapPath(&quot;img.mdb&quot;)<br>Conn.Open<br>Set Rs = Server.CreateObject(&quot;ADODB.Recordset&quot;)<br>Sql = &quot;SELECT TOP 1 * FROM [img]&quot;<br>Rs.Open Sql, Conn, 1,3<br>Rs.AddNew<br>Rs(&quot;id&quot;) = strnow<br>Rs(&quot;addtime&quot;) = now()<br>Rs(&quot;imgdata&quot;).AppendChunk(strSaveData)<br>Rs.Update<br>img_size = Rs(&quot;imgdata&quot;).ActualSize<br>saa = Rs(&quot;imgdata&quot;).GetChunk(img_size)Call SaveStream(&quot;../UploadFile/&quot; &amp; strNow &amp; &quot;.bmp&quot;, saa)   <span style="color:#339933;line-height:1.8em;">'保存为BMP位图</span><wbr /><br><span style="color:#339933;line-height:1.8em;">'或使用Persits.Jpeg组件保存为JPG图片</span><wbr /><br><span style="color:#339933;line-height:1.8em;">'Set Jpeg = Server.CreateObject(&quot;Persits.Jpeg&quot;)</span><wbr /><br><span style="color:#339933;line-height:1.8em;">'Jpeg.OpenBinary Rs(&quot;imgdata&quot;).Value<br>'Jpeg.Save Server.MapPath(&quot;../UploadFile/&quot; &amp; strNow &amp; &quot;.jpg&quot;)</span><wbr /><span style="color:#339933;line-height:1.8em;">'Set Jpeg = Nothing</span><wbr /><br>Response.Write &quot;&lt;img src=&quot;&quot;../UploadFile/&quot; &amp; strNow &amp; &quot;.jpg&quot;&quot;&gt;&quot;<br> <br><span style="font-weight:bold"><wbr />'Set&quot; rs=&quot;Nothing<br>Conn.Close<br>Set&quot; font=&quot;font&quot; conn=&quot;Nothing<br>Response.Write&quot; lt=&quot;lt&quot; uploadfile=&quot;uploadfile&quot; strsavefilename=&quot;strsavefilename&quot; amp=&quot;amp&quot; gt=&quot;gt&quot; /&gt;Sub SaveStream(paR_strFile, paR_streamContent)<br>   Dim objStream<br>   Set objStream =Server.CreateObject(&quot;ADODB.Stream&quot;)<br>   With objStream<br>      .Type = 1<br>      .Open<br>      .Write paR_streamContent<br>      .SaveToFile Server.Mappath(paR_strFile), 2<br>      .Close()<br>   End with<br>   Set objStream = Nothing<br>End Sub <br>Function To3(nums)<br>   To3 = ChrB(cLng(&quot;&amp;H&quot; &amp; Right(nums, 2))) &amp; ChrB(cLng(&quot;&amp;H&quot; &amp; Mid(nums, 3, 2))) &amp; ChrB(cLng(&quot;&amp;H&quot; &amp; Left(nums, 2)))<br>End Function<br>%&gt;<span style="color:#339933;line-height:1.8em;"> <span style="color:#990000;line-height:1.8em;">将BMP文件转换成JPG格式只需使用Persits.Jpeg（即AspJpeg 图像处理组件）即可，实现代码请参考注释代码或相关资料。</span><wbr /><br><span style="color:#cccccc;line-height:1.8em;">原创内容,转载请注明出处:<a href="http://user.qzone.qq.com/29583894/blog/1252765630" target="_blank"><span style="color:#cccccc;line-height:1.8em;">http://user.qzone.qq.com/29583894/blog/1252765630</span><wbr /></a><wbr /></span><wbr /><br></span><wbr /> <!--v:3.2--> ]]></description>
<category><![CDATA[技术]]></category>
<author><![CDATA[29583894@qq.com(燕子李三)]]></author>
<comments>http://29583894.qzone.qq.com/blog/1252765630#comment</comments>
<qz:effect>134222400</qz:effect>
<pubDate>Sat, 12 Sep 2009 14:27:10 GMT</pubDate>
<guid>http://29583894.qzone.qq.com/blog/1252765630</guid>
</item>

<item>
<title><![CDATA[BMP文件结构]]></title>
<link>http://29583894.qzone.qq.com/blog/1252763701</link>
<description><![CDATA[　　<span style="font-weight:bold"><wbr />BMP</span><wbr />取自位图<span style="font-weight:bold"><wbr />B</span><wbr />it<span style="font-weight:bold"><wbr />M</span><wbr />a<span style="font-weight:bold"><wbr />P</span><wbr />的缩写，也称为<span style="font-weight:bold"><wbr />DIB</span><wbr />（与设备无关的<span style="font-weight:bold"><wbr />位图</span><wbr />）是微软视窗图形子系统GDI）内部使用的一种位图图形格式，它是微软视窗平台上的一个简单的图形文件格式。<br>　　图像通常保存的颜色深度有2（1位）、16（4位）、256（8位）、65536（16位）和1670万（24位）种颜色（其中位是表示每点所用的数据位）。8位图像可以是索引彩色图像外，也可以是灰阶图像。表示透明的alpha通道也可以保存在一个类似于灰阶图像的独立文件中。带有集成的alpha通道的32位版本已经随着Windows XP出现，它在视窗的登录和主题系统中都有使用，但是还没有多少图像编辑软件支持。<br> <br><br>存储算法 <br>　　BMP文件通常是不压缩的，所以它们通常比同一幅图像的压缩图像文件格式要大很多。例如，一个800×600的24位几乎占据1.4MB空间。因此它们通常不适合在因特网或者其他低速或者有容量限制的媒介上进行传输。<br>　　根据颜色深度的不同，图像上的一个像素可以用一个或者多个字节表示，它由<span style="font-weight:bold"><wbr />n/8</span><wbr />所确定（n是位深度，1字节包含8个数据位）。图片浏览器等基于字节的ASCII值计算像素的颜色，然后从调色板中读出相应的值。更为详细的信息请参阅下面关于位图文件的部分。<br>　　n位2n种颜色的包含调色板的位图近似字节数可以用下面的公式计算：<br>　　<span style="font-weight:bold"><wbr />BMP文件大小</span><wbr /> <wbr /><a href="http://b23.photo.store.qq.com/http_imgload.cgi?/rurl4_b=8cc19266a1e3563cab0989d39582bd2cfd2dd9281f3bb43a63de898dbb770b396ae964d6ce5be311a005e84a6460fb7606bc26bfe5a0624491664865ab821cd3caf05cff2c536c0368f0258ab3434e585e9bda10" target="_blank"><img style="width:279px;height:42px;border:0;" src="http://b23.photo.store.qq.com/http_imgload.cgi?/rurl4_b=8cc19266a1e3563cab0989d39582bd2cfd2dd9281f3bb43a63de898dbb770b396ae964d6ce5be311a005e84a6460fb7606bc26bfe5a0624491664865ab821cd3caf05cff2c536c0368f0258ab3434e585e9bda10" /></a><wbr />，其中高度和宽度都是像素数。<br>　　需要注意的是上面公式中的<span style="font-weight:bold"><wbr />54</span><wbr />是位图文件的文件头，<wbr /><a href="http://b23.photo.store.qq.com/http_imgload.cgi?/rurl4_b=8cc19266a1e3563cab0989d39582bd2cb5624d1c882265bd50af96ba0749434638b6b07103d935e73002eb16783af0fe319fb1565a743fbbc441900115dc6224e87053a0661ddb252b8a8cedd178e291560fdb20" target="_blank"><img style="width:43px;height:16px;border:0;" src="http://b23.photo.store.qq.com/http_imgload.cgi?/rurl4_b=8cc19266a1e3563cab0989d39582bd2cb5624d1c882265bd50af96ba0749434638b6b07103d935e73002eb16783af0fe319fb1565a743fbbc441900115dc6224e87053a0661ddb252b8a8cedd178e291560fdb20" /></a><wbr />是彩色调色板的大小。 如果位图文件不包含调色板，如24位，32位位图，则位图的近似字节数可以用下面的公式计算：<br>　　<span style="font-weight:bold"><wbr />BMP文件大小</span><wbr /> <wbr /><a href="http://b23.photo.store.qq.com/http_imgload.cgi?/rurl4_b=8cc19266a1e3563cab0989d39582bd2c55975ec19e843893f94089bad43b557127d8b2bd1e4358dae5190006c73e8c852f3ee26815721bc3a8c2c350a7b5142b357efebada320b4907da6129218b1fbe42d4a81b" target="_blank"><img style="width:211px;height:42px;border:0;" src="http://b23.photo.store.qq.com/http_imgload.cgi?/rurl4_b=8cc19266a1e3563cab0989d39582bd2c55975ec19e843893f94089bad43b557127d8b2bd1e4358dae5190006c73e8c852f3ee26815721bc3a8c2c350a7b5142b357efebada320b4907da6129218b1fbe42d4a81b" /></a><wbr />，其中高度和宽度都是像素数。<br>　　另外需要注意的是这是一个近似值，对于n位的位图图像来说，尽管可能有最多2<span style="font-style:italic"><wbr />n</span><wbr />中颜色，一个特定的图像可能并不会使用这些所有的颜色。由于彩色调色板仅仅定义了图像所用的颜色，所以实际的彩色调色板将小于<wbr /><a href="http://b23.photo.store.qq.com/http_imgload.cgi?/rurl4_b=8cc19266a1e3563cab0989d39582bd2cb5624d1c882265bd50af96ba0749434638b6b07103d935e73002eb16783af0fe319fb1565a743fbbc441900115dc6224e87053a0661ddb252b8a8cedd178e291560fdb20" target="_blank"><img style="width:43px;height:16px;border:0;" src="http://b23.photo.store.qq.com/http_imgload.cgi?/rurl4_b=8cc19266a1e3563cab0989d39582bd2cb5624d1c882265bd50af96ba0749434638b6b07103d935e73002eb16783af0fe319fb1565a743fbbc441900115dc6224e87053a0661ddb252b8a8cedd178e291560fdb20" /></a><wbr />。<br>　　如果想知道这些值是如何得到的，请参考下面文件格式的部分。<br>　　由于存储算法本身决定的因素，根据几个图像参数的不同计算出的大小与实际的文件大小将会有一些细小的差别。<br><br> 典型的文件格式 <br>　　典型的位图文件格式通常包含下面几个数据块：<br><span style="text-decoration:underline;"><wbr /><li style="margin:25px;"><span style="font-weight:bold"><wbr />位图头：</span><wbr />保存位图文件的总体信息。 <li style="margin:25px;"><span style="font-weight:bold"><wbr />位图信息：</span><wbr />保存位图图像的详细信息。 <li style="margin:25px;"><span style="font-weight:bold"><wbr />调色板：</span><wbr />保存所用颜色的定义。 <li style="margin:25px;"><span style="font-weight:bold"><wbr />位图数据：</span><wbr />保存一个又一个像素的实际图像。 </li></span><wbr />　　下面的部分将会详细地描述位图文件中保存的数据。需要注意的是这是标准位图的文件格式，其他一些位图图像可能根据生成文件的应用程序不同所使用格式可能会有细微的区别。<br> <br><br>位图头 <br>　　这部分是识别信息，典型的应用程序会首先普通读取这部分数据以确保的确是位图文件并且没有损坏。<br><span style="text-decoration:underline;"><wbr /><li style="margin:25px;">字节 #0-1 保存位图文件的标识符，这两个字节的典型数据是<span style="font-weight:bold"><wbr />BM</span><wbr />。 <li style="margin:25px;">字节 #2-5 使用一个dword保存位图文件大小。 <li style="margin:25px;">字节 #6-9 是保留部分，留做以后的扩展使用,对实际的解码格式没有影响。 <li style="margin:25px;">字节 #10-13 保存位图数据位置的地址偏移，也就是起始地址。 </li></span><wbr /><br> 位图信息 <br>　　这部分告诉应用程序图像的详细信息，在屏幕上显示图像将会使用这些信息，它从文件的第15个字节开始。<br><span style="text-decoration:underline;"><wbr /><li style="margin:25px;">字节 #14-17 定义以下用来描述影像的区块（BitmapInfoHeader）的大小。它的值是：<span style="font-weight:bold"><wbr />40</span><wbr /> - Windows 3.2、95、NT、<span style="font-weight:bold"><wbr />12</span><wbr /> - OS/2 1.x、240 - OS/2 2.x <li style="margin:25px;">字节 #18-21 保存位图宽度（以像素个数表示）。 <li style="margin:25px;">字节 #22-25 保存位图高度（以像素个数表示）。 <li style="margin:25px;">字节 #26-27 保存所用彩色位面的个数。不经常使用。 <li style="margin:25px;">字节 #28-29 保存每个像素的位数，它是图像的颜色深度。常用值是1、4、8（灰阶）和24（彩色）。 <li style="margin:25px;">字节 #30-33 定义所用的压缩算法。允许的值是0、1、2、3、4、5。 </li></span><wbr />　　0 - 没有压缩（也用BI_RGB表示）　　1 - 行程长度编码8位/像素（也用BI_RLE8表示）　　2 - 行程长度编码4位/像素（也用BI_RLE4表示）　　3 - Bit field（也用BI_BITFIELDS表示）　　4 - JPEG图像（也用BI_JPEG表示）　　5 - PNG图像（也用BI_PNG表示）　　然而，由于大多数位图文件都是不压缩的，所以最常用的值是0。<br><span style="text-decoration:underline;"><wbr /><li style="margin:25px;">字节 #34-37 保存图像大小。这是原始（:en:raw）位图数据的大小，不要与文件大小混淆。 <li style="margin:25px;">字节 #38-41 保存图像水平方向分辨率。 <li style="margin:25px;">字节 #42-45 保存图像竖值方向分辨率。 <li style="margin:25px;">字节 #46-49 保存所用颜色数目。 <li style="margin:25px;">字节 #50-53 保存所用重要颜色数目。当每个颜色都重要时这个值与颜色数目相等。 </li></span><wbr /><br> 调色板 <br>　　这部分定义了图像中所用的颜色。如上所述，位图图像一个像素接着一个像素存储，每个像素使用一个或者多个字节的值表示，所以调色板的目的就是要告诉应用程序这些值所对应的实际颜色。<br>　　典型的位图文件使用RGB彩色模型。在这种模型中，每种颜色都是由不同强度（从0到最大强度）的红色（R）、绿色（G）和蓝色（B）组成的，也就是说，每种颜色都可以使用红色、绿色和蓝色的值所定义。<br>　　在位图文件的实现中，调色板可以包含很多条目，条目个数就是图像中所使用的颜色的个数。每个条目包含4个字节：其中三个表示红色、绿色和蓝色，第四个字节没有使用（大多数应用程序将它设为0）。对于每个字节，数值0表示相应的颜色在当前的图像文件中没有使用，而数值255表示那个颜色使用最大的强度。<br> <br><br>位图数据 <br>　　这部分逐个像素表示图像。像素是从下到上、从左到右保存的。每个像素使用一个或者多个字节表示。如果一个图像水平线的字节数不是4的倍数，这行就使用空字节补齐，通常是ASCII码0。（十六进制的00，而不是00 00 00）<br>　　范例： 有一张5*5的图片，应该会有25个pixels，但是因为5不是4的倍数所以会显示成：<br>@@@@@@xxxxx000xx<br>xxx000xxxxx000xx<br>xxx000xxxxx000<br>x代表调色盘的编号 0代表Null_character @代表调色盘最后几笔资料　　有一张4*4的图片，应该会有16个pixels，但是因为是4的倍数所以会显示成：<br>@@@@@@xxxxxxxxxx<br>xxxxxx <br><br>其他 <br>　　尽管文件大小比较大，但是位图文件的简单性、在微软Windows和其他地方的广泛使用以及这种格式的优秀文档标准以及没有专利约束，使得它成为其他操作系统图像处理程序能够读写的一种最为常用的格式。<br>　　X Window System使用类似的<span style="font-weight:bold"><wbr />.XBM</span><wbr />格式表示一位黑白图像以及<span style="font-weight:bold"><wbr />.XPM</span><wbr />（<span style="font-weight:bold"><wbr />pixelmap</span><wbr />）表示彩色图像。另外还有一种<span style="font-weight:bold"><wbr />.RAW</span><wbr />格式，它除了保存原始数据之外没有任何其他信息。其他还有Portable Pixmap file format（<span style="font-weight:bold"><wbr />.PPM</span><wbr />）和Truevision TGA（<span style="font-weight:bold"><wbr />.TGA</span><wbr />），但是它们用得很少或者只用于特殊目的。尽管其他格式也保存为“位图”（与矢量图不同），但是它们使用数据压缩或者颜色索引，所以它们不是严格意义上的位图。<br>　　由于包含有冗余信息，许多BMP文件使用类似于ZIP这样的无损数据压缩算法能够取得很好的压缩效果。<br> <!--v:3.2--> ]]></description>
<category><![CDATA[技术]]></category>
<author><![CDATA[29583894@qq.com(燕子李三)]]></author>
<comments>http://29583894.qzone.qq.com/blog/1252763701#comment</comments>
<qz:effect>134218241</qz:effect>
<pubDate>Sat, 12 Sep 2009 13:55:01 GMT</pubDate>
<guid>http://29583894.qzone.qq.com/blog/1252763701</guid>
</item>

<item>
<title><![CDATA[播放软件设置不当导致播放电影无图像]]></title>
<link>http://29583894.qzone.qq.com/blog/1252155542</link>
<description><![CDATA[　　前些天因为清理系统，卸载了一些重复安装的解码器（本人常用的KMP已自带大量解码器），而后发现主显示器在播放影片时只有声音没有图像，换用其它的播放器依然如此，但输出到HDTV却正常。本以为是卸载解码器时丢失了设置造成的，便将卸去的解码器又重新安装，故障依旧。于事开始做大规模的系统检查，先是更新所有解码器到最新版本，未果；接下来是更新显卡驱动，显卡控制中心程序，未果；检查所有已安装的解码器，并重新注册有问题的滤镜，未果。后来发现在启动显卡控制中心后，只要切换到“视频”设置时，此选项卡中的“视频预览”和电影的画面就都能看到了，猜想是由于显卡控制中心程序在显示“视频预览”时重置了显卡的某些参数，所以使得视频才能正常显示了，但在系统重启后或是关闭显卡控制中心程序后就又看不到图像了。<br>　　在多种尝试均未果后，寄希望于百度，网上有很多人遇到A卡看电影无图像的问题，除了没有解决的，都和我的情况不同。后来想到KMP中的配置甚多，逐一研究。最终发现在色彩控制的硬件部分有些设置异常，主要是亮度和对比度为零。将其调整回默认的100％问题解决。如图：<br><div style="text-align:center;"><wbr /><a href="http://b23.photo.store.qq.com/http_imgload.cgi?/rurl4_b=8cc19266a1e3563cab0989d39582bd2c81b003abb23b34f628db8d5a13aefc66702cecfce53fa3e8af8410dc2eb99804be69b21fd3ee0764ced4fd180b9423afdb64fbeb91ee6dc0bdf0b8ac92cc88ffb17019c7" target="_blank"><img style="width:626px;height:539px;border:0;" src="http://b23.photo.store.qq.com/http_imgload.cgi?/rurl4_b=8cc19266a1e3563cab0989d39582bd2c81b003abb23b34f628db8d5a13aefc66702cecfce53fa3e8af8410dc2eb99804be69b21fd3ee0764ced4fd180b9423afdb64fbeb91ee6dc0bdf0b8ac92cc88ffb17019c7" /></a><wbr /></div><br>　　一个软件对系统硬件参数（或驱动参数）做出错误的修改，往往会影响很多软件的使用。要学会发现问题，分析原因，尝试自己动手解决，如果盲目的重做系统，就将失去一次宝贵的经验。 <!--v:3.2--> ]]></description>
<category><![CDATA[技术]]></category>
<author><![CDATA[29583894@qq.com(燕子李三)]]></author>
<comments>http://29583894.qzone.qq.com/blog/1252155542#comment</comments>
<qz:effect>134218305</qz:effect>
<pubDate>Sat, 05 Sep 2009 12:59:02 GMT</pubDate>
<guid>http://29583894.qzone.qq.com/blog/1252155542</guid>
</item>

<item>
<title><![CDATA[深入理解Javascript闭包(closure)]]></title>
<link>http://29583894.qzone.qq.com/blog/1251978382</link>
<description><![CDATA[　　最近在网上查阅了不少Javascript闭包(closure)相关的资料，写的大多是非常的学术和专业。对于初学者来说别说理解闭包了，就连文字叙述都很难看懂。撰写此文的目的就是用最通俗的文字揭开Javascript闭包的真实面目。 <br><span style="font-weight:bold"><wbr />一、什么是闭包？</span><wbr /> <br>　　“官方”的解释是：所谓“闭包”，指的是一个拥有许多变量和绑定了这些变量的环境的表达式（通常是一个函数），因而这些变量也是该表达式的一部分。 <br>　　相信很少有人能直接看懂这句话，因为他描述的太学术。我想用如何在Javascript中创建一个闭包来告诉你什么是闭包，因为跳过闭包的创建过程直接理解闭包的定义是非常困难的。看下面这段代码： <br>   function a(){ <br>      var i=0; <br>      function b(){ <br>         alert(++i); <br>      } <br>      return b; <br>   } <br>   var c = a(); <br>   c(); <br>这段代码有两个特点： <br>1、函数b嵌套在函数a内部； <br>2、函数a返回函数b。 <br>　　这样在执行完var c=a()后，变量c实际上是指向了函数b，再执行c()后就会弹出一个窗口显示i的值(第一次为1)。这段代码其实就创建了一个闭包，为什么？因为函数a外的变量c引用了函数a内的函数b，就是说： <br><span style="font-style:italic"><wbr /><span style="font-weight:bold"><wbr />当函数a的内部函数b被函数a外的一个变量引用的时候，就创建了一个闭包。</span><wbr /></span><wbr /><br>　　我猜想你一定还是不理解闭包，因为你不知道闭包有什么作用，下面让我们继续探索。<br><span style="font-weight:bold"><wbr />二、闭包有什么作用？</span><wbr /> <br>　　简而言之，闭包的作用就是在a执行完并返回后，闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源，因为a的内部函数b的执行需要依赖a中的变量。这是对闭包作用的非常直白的描述，不专业也不严谨，但大概意思就是这样，理解闭包需要循序渐进的过程。 <br>　　在上面的例子中，由于闭包的存在使得函数a返回后，a中的i始终存在，这样每次执行c()，i都是自加1后alert出i的值。 <br>　　那么我们来想象另一种情况，如果a返回的不是函数b，情况就完全不同了。因为a执行完后，b没有被返回给a的外界，只是被a所引用，而此时a也只会被b引用，因此函数a和b互相引用但又不被外界打扰(被外界引用)，函数a和b就会被GC回收。(关于Javascript的垃圾回收机制将在后面详细介绍) <br><span style="font-weight:bold"><wbr />三、闭包内的微观世界</span><wbr /> <br>　　如果要更加深入的了解闭包以及函数a和嵌套函数b的关系，我们需要引入另外几个概念：函数的执行环境(excution context)、活动对象(call object)、作用域(scope)、作用域链(scope chain)。以函数a从定义到执行的过程为例阐述这几个概念。 <br>　　1、当定义函数a的时候，js解释器会将函数a的作用域链(scope chain)设置为定义a时a所在的“环境”，如果a是一个全局函数，则scope chain中只有window对象。 <br>　　2、当函数a执行的时候，a会进入相应的执行环境(excution context)。 <br>　　3、在创建执行环境的过程中，首先会为a添加一个scope属性，即a的作用域，其值就为第1步中的scope chain。即a.scope=a的作用域链。 <br>　　4、然后执行环境会创建一个活动对象(call object)。活动对象也是一个拥有属性的对象，但它不具有原型而且不能通过JavaScript代码直接访问。创建完活动对象后，把活动对象添加到a的作用域链的最顶端。此时a的作用域链包含了两个对象：a的活动对象和window对象。 <br>　　5、下一步是在活动对象上添加一个arguments属性，它保存着调用函数a时所传递的参数。 <br>　　6、最后把所有函数a的形参和内部的函数b的引用也添加到a的活动对象上。在这一步中，完成了函数b的的定义，因此如同第3步，函数b的作用域链被设置为b所被定义的环境，即a的作用域。<br>　　到此，整个函数a从定义到执行的步骤就完成了。此时a返回函数b的引用给c，又函数b的作用域链包含了对函数a的活动对象的引用，也就是说b可以访问到a中定义的所有变量和函数。函数b被c引用，函数b又依赖函数a，因此函数a在返回后不会被GC回收。 <br>　　当函数b执行的时候亦会像以上步骤一样。因此，执行时b的作用域链包含了3个对象：b的活动对象、a的活动对象和window对象，如下图所示：<div style="text-align:center;"><wbr /><a href="http://b24.photo.store.qq.com/http_imgload.cgi?/rurl4_b=8cc19266a1e3563cab0989d39582bd2c6c3151a31c66d5a69eb0e3f34f4c336815aeba067ac30a1cc14e4f30154a236de3533a2ba35297f6fbe721df82810096c18d9402ce95d9e7ace1cb6e15714efa2bcc6d95" target="_blank"><img style="width:500px;height:180px;border:0;" src="http://b24.photo.store.qq.com/http_imgload.cgi?/rurl4_b=8cc19266a1e3563cab0989d39582bd2c6c3151a31c66d5a69eb0e3f34f4c336815aeba067ac30a1cc14e4f30154a236de3533a2ba35297f6fbe721df82810096c18d9402ce95d9e7ace1cb6e15714efa2bcc6d95" /></a><wbr /></div><br>　　如图所示，当在函数b中访问一个变量的时候，搜索顺序是先搜索自身的活动对象，如果存在则返回，如果不存在将继续搜索函数a的活动对象，依 次查找，直到找到为止。如果整个作用域链上都无法找到，则返回undefined。如果函数b存在prototype原型对象，则在查找完自身的活动对象 后先查找自身的原型对象，再继续查找。这就是Javascript中的变量查找机制。 <br><span style="font-weight:bold"><wbr /></span><wbr /><span style="font-weight:bold"><wbr />四、闭包的应用场景</span><wbr /><br>　　1、保护函数内的变量安全。以最开始的例子为例，函数a中i只有函数b才能访问，而无法通过其他途径访问到，因此保护了i的安全性。 <br>　　2、在内存中维持一个变量。依然如前例，由于闭包，函数a中i的一直存在于内存中，因此每次执行c()，都会给i自加1。 <br>　　以上两点是闭包最基本的应用场景，很多经典案例都源于此。 <br><span style="font-weight:bold"><wbr />五、Javascript的垃圾回收机制</span><wbr /> <br>　　在Javascript中，如果一个对象不再被引用，那么这个对象就会被GC回收。如果两个对象互相引用，而不再被第3者所引用，那么这两个互相引用的对象也会被回收。因为函数a被b引用，b又被a外的c引用，这就是为什么函数a执行后不会被回收的原因。 <!--v:3.2--> ]]></description>
<category><![CDATA[技术]]></category>
<author><![CDATA[29583894@qq.com(燕子李三)]]></author>
<comments>http://29583894.qzone.qq.com/blog/1251978382#comment</comments>
<qz:effect>134218305</qz:effect>
<pubDate>Thu, 03 Sep 2009 11:46:22 GMT</pubDate>
<guid>http://29583894.qzone.qq.com/blog/1251978382</guid>
</item>

<item>
<title><![CDATA[传递额外的数据到callback函数]]></title>
<link>http://29583894.qzone.qq.com/blog/1251943343</link>
<description><![CDATA[　　通常我们需要传递额外的数据到callback函数，但是因为所有的回调函数都只有一个参数(远程方法的返回结果)，这就需要一些小技巧了。 <br>　　解决方案就是使用Javascript的闭包特性。 <br>例如，你的回调函数原本需要像这个样子： <br>function callbackFunc(dataFromServer, dataFromBrowser) {    // 用dataFromServer和dataFromBrowser做些事情...... }<br>那么你可以像这个组织你的函数： <br>var dataFromBrowser = ...; // 定义一个闭包函数来存储dataFromBrowser的引用，并调用dataFromServer var callbackProxy = function(dataFromServer) {    callbackFunc(dataFromServer, dataFromBrowser); }; var callMetaData = { callback:callbackProxy }; Remote.method(params, callMetaData);<br>(调用元数据在脚本介绍中有解释) <br>　　换句话说，现在你作为callback函数传递过来的不是一个真正的callback，他只是一个做为代理的闭包，用来传递客户端的数据。 <br>你可以用更简介的形式： <br>var dataFromBrowser = ...; Remote.method(params, {    callback:function(dataFromServer) {       callbackFunc(dataFromServer, dataFromBrowser);    } }); <!--v:3.2--> ]]></description>
<category><![CDATA[技术]]></category>
<author><![CDATA[29583894@qq.com(燕子李三)]]></author>
<comments>http://29583894.qzone.qq.com/blog/1251943343#comment</comments>
<qz:effect>134218304</qz:effect>
<pubDate>Thu, 03 Sep 2009 02:02:23 GMT</pubDate>
<guid>http://29583894.qzone.qq.com/blog/1251943343</guid>
</item>

</channel>
</rss>

