<script language="jscript">
function myclass() {
var name="myname";
this.showName=showName;
function showName() {
alert(getName());
};
this.setName=function () {
setName();
}; function getName() {
return name;
}
function setName() {
name = Math.random();
}
}var obj=new myclass;
obj.showName();
obj.setName();
obj.showName();
</script>

解决方案 »

  1.   

    因为在
    function getName() {
      return this.name;
    }
    里面不能调用外层函数的私有属性,所以在fason(咖啡人生) 的例子里把name定义为公共变量就OK了
      

  2.   

    <script language="jscript">
    function myclass() {
    this.name="myname";
    this.showName=function()
    {
    showName(obj=this);
    }
    function showName() {
    alert(getName(arguments[0]));
    } function getName() {
    return arguments[0].name;
    }
    }
    var obj=new myclass;
    obj.showName();
    </script>
      

  3.   

    或者
    <script language="jscript">
    function myclass() {
    this.name="myname";
    this.showName=showName;
    function showName() {
    alert(this.getName());
    }
    this.getName=function()
    {
    return this.name;
    }
    }
    var obj=new myclass;
    obj.showName();
    </script>
      

  4.   

    <script language="jscript">
    function myclass() {
    this.name="myname1";

    this.showName=function()
     {
    alert(this.getName());
    }
    this.getName=function()
    {
    return this.name;
    }
    }
    var obj=new myclass;
    obj.showName();
    </script>
      

  5.   

    看了一下觉得问题出现在下面函数
    function getName() {
    return this.name;
    }
    大家都应该知道每个JS函数其实就是一个对象,当你返回this.name其实是返回getName这个对象的属性,而这个属性你又没有给赋值那当然没有了。
      

  6.   

    <script language="jscript">
    function myclass() {
    this.name="myname";
    this.showName=showName;
    function showName() {
    alert(getName.call(this));
    }function getName() {
    return this.name;
    }
    }var obj=new myclass;
    obj.showName();
    </script>
    alert(getName());
    ==>  只改动这一行代码即可
    alert(getName.call(this));
      

  7.   

    差点忘记call和apply了 - -
      

  8.   

    function getName() {
    return this.name;
    }
    }
    这里指向的是getName.name
    <script language="jscript">
    function myclass() {
    this.name="myname";
    this.showName=showName;
    function showName() {
    alert(this.getName());
    }this.getName=function() {
    return this.name;
    }
    }var obj=new myclass;
    obj.showName();
    </script>
      

  9.   

    也可以用这样的变通方法,把this指针的引用给一个变量<script language="jscript">
    function myclass() {
    var a=this;
    this.name="myname";
    this.showName=showName;
    function showName() {
    alert(getName());
    }function getName() {
    return a.name;
    }
    }var obj=new myclass;
    obj.showName();
    </script>
      

  10.   

    <SCRIPT LANGUAGE="JavaScript">
    <!--
    function x(n)
    {
        function y()
        {
            function inner1()
            {
                alert(n);
            }
            
            function inner2()
            {
                n = n + 1;
            }            return [inner1, inner2];
        }
        return y;
    }a = x(3);
    farray = a();
    f1 = farray[0];
    f2 = farray[1];f1();
    f2();
    f1();farray2 = a();
    g1 = farray2[0];
    g2 = farray2[1];g1();
    g2();
    f1();
    //-->
    </SCRIPT>http://rchen.cnblogs.com/archive/2006/05/19/404598.html
      

  11.   

    inelm(烦恼即菩提)贴的这段跟上次梅花雪讨论的类似,x不需要用new来声明,貌似不是一个标准类了。
      

  12.   

    dreamover(梦醒了) ,哪不对了?请你指教。
      

  13.   

    function myclass(){
    ....
    this.getName=function() {
    return this.name;}  //指向的是 myclass.namefunction getName()
    {
    return this.name; //指向的是getname.name
    }
    }
      

  14.   

    建议先看看JS基础语法,再深入了解下 “类”与prototype,相信你目前的这种问题到时候就自然解开了。
      

  15.   

    忘记还有一个非常重要的东东了,就是context,了解这个也是必不可少的。
      

  16.   

    找到问题了。
    根据Microsoft(R) JScript(R) HELP中,有这么一段:
    对于 JScript 的客户版本,如果在其他所有对象的上下文之外使用 this,则它指的是 window 对象。同时也已经进行了验证,确实是如此。几位朋友说的函数中this指的是函数本身的,其实不是,而是window。欢迎大家继续讨论,月底结帖。
      

  17.   

    找到问题了。
    根据Microsoft(R) JScript(R) HELP中,有这么一段:
    对于 JScript 的客户版本,如果在其他所有对象的上下文之外使用 this,则它指的是 window 对象。同时也已经进行了验证,确实是如此。几位朋友说的函数中this指的是函数本身的,其实不是,而是window。欢迎大家继续讨论,月底结帖。
    ----------------------------------并非如此,this是指向本身的指针,但是我们可以这么用<SCRIPT LANGUAGE="JavaScript">
    <!--
    var a = "BlueDestiny";
    alert(window.a);
    alert(this.a);function f() {
    alert("never-online");
    }
    function c(x) {
    this.a = function(){alert("memeber")};
    this[x]();
    this['a']();
    }
    c("f");
    //-->
    </SCRIPT>
      

  18.   

    楼上说的也对,但更正确的是涉及到JScript对Context的处理,只要理解了Context的处理,不管在哪里的this,你就都不会判断失误。关于这个Context是如何处理的我心里明白,但文章一时找不出来,报歉!大概说一点:我所谓的Context(上下文),在JS中的表现形式主要就是this
    即,this这个关键字就是指向Context对象。
      

  19.   

    而Context对象是运行时才能确定的,所以有了apply,call这两个函数的存在,调用这两个函数,有别于普通函数,普通函数运行时,其Context对象要么是调用该方法的实例对象,要么就是Gloable(即window了),而那两个函数却可以指定函数在运行时其Context对象。大概就这么多了,语言能力不强,见笑了。
      

  20.   

    理解Context对象是正确理解和合理使用this关键字的前提。要想学懂JS不难。精通DOM这才是难点。我总结一下学JS的经验吧,基础语法就不用说了,首先理解“类”,然后理解prototype,然后理解Context。大的方面就这样,小的方面比如个别函数:apply,call,join等,在应用中积累,能记多少记多少,不求记住参数格式,知道它的存在和它提供的功能就可以了,用的时候再查MSDN。学会查阅MSDN也是很重要的,不然没得查就很郁闷了。
      

  21.   

    to BlueDestiny(www.never-online.net):
    你的代码更证明了HELP说的那段。
    因为function c(x),在不是构造函数的情况下,并不会生成新对象,所以this指向的就是window。如果你怀疑的话,可以在普通函数(非构造函数)里加入这句试试:if(window===this) alert("yes")。其实,我真正困惑的是,为什么JS会把对象的内部内的this当成对象之外。换句话说,为什么把内部函数当成上下文之外。比如下面这样:
    function c(x) {
    function f1() {
    if(window===this) alert("why?");
    }
    this.f2=function() {
    if(window===this) 
    alert("why?");
    else
    alert("no!");
    }
    f1()
    this.f2();
    }
    obj=new c();
    =============================================
    to Amwpfiqvy(侠客行):
    你的解释和我上面写的例子更矛盾了。
    >>>>>>普通函数运行时,其Context对象要么是调用该方法的实例对象,要么就是Gloable(即window了)如果按照你的说法,那么例子中的f1就成了Gloable,同时也成了window.f1()。那么根据你的结论,你可以试着运行下面代码:
    <SCRIPT LANGUAGE="JavaScript">
    function c(x) {
    function f1() {
    if(window===this) alert("why?");
    }
    this.f2=function() {
    if(window===this) 
    alert("why?");
    else
    alert("no!");
    }
    window.f1()
    this.f2();
    }
    obj=new c();
    window.f1();//或者直接f1();
    </SCRIPT>
    =================说说我的结论,其实我一直认为对象的内部函数应该是private的,虽然JS并没有这个关键字。但是JS居然把private函数的作用域又划到了对象外去。说起来这也许是JS的BUG,也是缺陷。所以至今都没有private诞生,大概也是这个原因。所以至今它不具备完整的面向对象特征。不然作为一个private的函数居然不能访问public的函数和属性,岂不笑掉大牙。