<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>shangjunhong</title>
    <description></description>
    <link>http://shangjunhong.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>全面理解javascript的caller,callee,call,apply概念 (转)</title>
        <author>shangjunhong</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://shangjunhong.javaeye.com">shangjunhong</a>&nbsp;
          链接：<a href="http://shangjunhong.javaeye.com/blog/202614" style="color:red;">http://shangjunhong.javaeye.com/blog/202614</a>&nbsp;
          发表时间: 2008年06月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在提到上述的概念之前，首先想说说javascript中函数的隐含参数：arguments <br /><br />Arguments <br /><br />该对象代表正在执行的函数和调用它的函数的参数。 <br /><br />[function.]arguments[n]<br />参数function ：选项。当前正在执行的 Function 对象的名字。 n ：选项。要传递给 Function 对象的从0开始的参数值索引。 <br />说明 <br /><br />Arguments是进行函数调用时，除了指定的参数外，还另外创建的一个隐藏对象。Arguments是一个类似数组但不是数组的对象，说它类似数组是因为其具有数组一样的访问性质及方式，可以由arguments[n]来访问对应的单个参数的值，并拥有数组长度属性length。还有就是arguments对象存储的是实际传递给函数的参数，而不局限于函数声明所定义的参数列表，而且不能显式创建 arguments 对象。arguments 对象只有函数开始时才可用。下边例子详细说明了这些性质: <br /><br /><br />//arguments 对象的用法。<br />function ArgTest(a, b){<br />   var i, s = "The ArgTest function expected ";<br />   var numargs = arguments.length;     // 获取被传递参数的数值。<br />   var expargs = ArgTest.length;       // 获取期望参数的数值。<br />   if (expargs &lt; 2)<br />      s += expargs + " argument. ";<br />   else<br />      s += expargs + " arguments. ";<br />   if (numargs &lt; 2)<br />      s += numargs + " was passed.";<br />   else<br />      s += numargs + " were passed.";<br />   s += "\n\n"<br />   for (i =0 ; i &lt; numargs; i++){      // 获取参数内容。<br />   s += "  Arg " + i + " = " + arguments[i] + "\n";<br />   }<br />   return(s);                          // 返回参数列表。<br />} <br /><br />在此添加了一个说明arguments不是数组(Array类)的代码: <br /><br /><br />Array.prototype.selfvalue = 1;<br />alert(new Array().selfvalue);<br />function testAguments(){<br />    alert(arguments.selfvalue);<br />} <br /><br />运行代码你会发现第一个alert显示1，这表示数组对象拥有selfvalue属性，值为1，而当你调用函数testAguments时，你会发现显示的是“undefined”，说明了不是arguments的属性，即arguments并不是一个数组对象。 <br /><br /> caller<br />  返回一个对函数的引用，该函数调用了当前函数。<br />  functionName.caller <br />  functionName 对象是所执行函数的名称。<br />说明<br />对于函数来说，caller 属性只有在函数执行时才有定义。如果函数是由顶层调用的，那么 caller 包含的就是 null 。如果在字符串上下文中使用 caller 属性，那么结果和 functionName.toString 一样，也就是说，显示的是函数的反编译文本。<br />下面的例子说明了 caller 属性的用法： <br /><br />// caller demo {<br />function callerDemo() {<br />    if (callerDemo.caller) {<br />        var a= callerDemo.caller.toString();<br />        alert(a);<br />    } else {<br />        alert("this is a top function");<br />    }<br />}<br />function handleCaller() {<br />    callerDemo();<br />} <br /><br />callee <br /><br />    返回正被执行的 Function 对象，也就是所指定的 Function 对象的正文。 <br /><br />[function.]arguments.callee<br />可选项 function 参数是当前正在执行的 Function 对象的名称。 <br /><br />说明 <br /><br />callee 属性的初始值就是正被执行的 Function 对象。 <br /><br />callee 属性是 arguments 对象的一个成员，它表示对函数对象本身的引用，这有利于匿名<br />函数的递归或者保证函数的封装性，例如下边示例的递归计算1到n的自然数之和。而该属性<br />仅当相关函数正在执行时才可用。还有需要注意的是callee拥有length属性，这个属性有时候<br />用于验证还是比较好的。arguments.length是实参长度，arguments.callee.length是<br />形参长度，由此可以判断调用时形参长度是否和实参长度一致。 <br /><br />示例 <br /><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("验证形参和实参长度正确！");<br />        return;<br />    } else {<br />        alert("实参长度：" +arguments.length);<br />        alert("形参长度： " +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 /><br />var sum = function(n){<br />    if (1==n) return 1;<br />else return n + sum (n-1); <br /><br />调用时：alert(sum(100));<br />其中函数内部包含了对sum自身的引用，函数名仅仅是一个变量名，在函数内部调用sum即相当于调用<br />一个全局变量，不能很好的体现出是调用自身，这时使用callee会是一个比较好的方法。 <br /><br /><br />apply and call <br /><br />   它们的作用都是将函数绑定到另外一个对象上去运行，两者仅在定义参数方式有所区别： <br /><br />    apply(thisArg,argArray); <br /><br />    call(thisArg[,arg1,arg2…] ]); <br /><br />即所有函数内部的this指针都会被赋值为thisArg，这可实现将函数作为另外一个对象的方法运行的目的 <br /><br />apply的说明 <br /><br />如果 argArray 不是一个有效的数组或者不是 arguments 对象，那么将导致一个 TypeError。<br />如果没有提供 argArray 和 thisArg任何一个参数，那么 Global 对象将被用作 thisArg， <br />并且无法被传递任何参数。 <br /><br />call的说明 <br /><br />call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisArg指定的新对象。<br />如果没有提供 thisArg参数，那么 Global 对象被用作 thisArg <br /><br />相关技巧： <br /><br />应用call和apply还有一个技巧在里面，就是用call和apply应用另一个函数（类）以后，当前的<br />函数（类）就具备了另一个函数（类）的方法或者是属性，这也可以称之为“继承”。看下面示例: <br /><br />// 继承的演示<br />function base() {<br />    this.member = " dnnsun_Member";<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 /><br />  <br /><br />顺便提一下，在javascript框架prototype里就使用apply来创建一个定义类的模式， <br /><br />其实现代码如下： <br /><br />var Class = {<br />  create: function() {<br />    return function() {<br />      this.initialize.apply(this, arguments);<br />    }<br />  }<br />}<br />解析：从代码看,该对象仅包含一个方法：Create，其返回一个函数，即类。但这也同时是类的<br />构造函数，其中调用initialize，而这个方法是在类创建时定义的初始化函数。通过如此途径，<br />就可以实现prototype中的类创建模式 <br /><br />示例： <br /><br />var vehicle=Class.create();<br />vehicle.prototype={<br />    initialize:function(type){<br />        this.type=type;<br />    }<br />    showSelf:function(){<br />        alert("this vehicle is "+ this.type);<br />    }<br />} <br /><br />var moto=new vehicle("Moto");<br />moto.showSelf();
          <br/>
          <span style="color:red;">
            <a href="http://shangjunhong.javaeye.com/blog/202614#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 12 Jun 2008 20:15:55 +0800</pubDate>
        <link>http://shangjunhong.javaeye.com/blog/202614</link>
        <guid>http://shangjunhong.javaeye.com/blog/202614</guid>
      </item>
      <item>
        <title>eclipse下安装js插件-spket(支持Ext)</title>
        <author>shangjunhong</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://shangjunhong.javaeye.com">shangjunhong</a>&nbsp;
          链接：<a href="http://shangjunhong.javaeye.com/blog/188454" style="color:red;">http://shangjunhong.javaeye.com/blog/188454</a>&nbsp;
          发表时间: 2008年04月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一直在寻找一个好用的js插件，以前用过jsEclipse什么的，但是比较起来 spket最好用了，而且它还支持ext，安装起来很简单.....<br /><br />1、选择Help -> Software Updates -> Find and Install...-> Search for new features to install ->New remote site...<br />Name: "Spket", Url: "http://www.spket.com/update/"下载完毕重启 Eclipse<br /><br />2、Window -> Preferences -> Spket -> JavaScript Profiles -> New ；<br />输入“ExtJS”点击OK；<br />选择“ExtJS” 并点击“Add Library”然后在下拉条中选取“ExtJS”；<br />选择 “ExtJS”并点击“Add File”，然后在你的./ext-2.x/source目录中选取“ext.jsb” 文件；<br /><br />3、设置新的ExtJS Profile，选中并点击“JavaScript Profiles” 对话框右手边的“Defalut”按钮；<br /><br />4、JS打开方式为 Window -> Preferences ->General-> Editors-> File...选择JS  为 Spket JavaScript Editor(default)*********（这个千万不要忘了！！！）<br /><br />5、新建个js试一试吧！ 呵呵。。。。
          <br/>
          <span style="color:red;">
            <a href="http://shangjunhong.javaeye.com/blog/188454#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 30 Apr 2008 16:06:51 +0800</pubDate>
        <link>http://shangjunhong.javaeye.com/blog/188454</link>
        <guid>http://shangjunhong.javaeye.com/blog/188454</guid>
      </item>
      <item>
        <title>刚开了个blog</title>
        <author>shangjunhong</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://shangjunhong.javaeye.com">shangjunhong</a>&nbsp;
          链接：<a href="http://shangjunhong.javaeye.com/blog/184560" style="color:red;">http://shangjunhong.javaeye.com/blog/184560</a>&nbsp;
          发表时间: 2008年04月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          参加工作已经2年多了，越来越发现自己的会的太少，进步的太慢。究其根本原因就是自己总结的太少，编程习惯不好，于是弄个博客，把自己的一些浅薄的看法写出来，希望大家多多批评指正！也希望自己能够坚持发下去，总能写出一些东西来。
          <br/>
          <span style="color:red;">
            <a href="http://shangjunhong.javaeye.com/blog/184560#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 20 Apr 2008 14:12:15 +0800</pubDate>
        <link>http://shangjunhong.javaeye.com/blog/184560</link>
        <guid>http://shangjunhong.javaeye.com/blog/184560</guid>
      </item>
  </channel>
</rss>