var methods = {
                printName : function() {
                    console.log('Tom');
                },
                printGreeting : function() {
                    console.log('Hello');
                    // printName();
                    methods.printName();
                }
            };            methods.printGreeting();
如上,如果直接调用printName();会抛出Uncaught ReferenceError: printName is not defined 的错误,如果用methods.printName();就没有错误。请问这如何理解?我记得其他的高级语言里同一个对象的方法在对象内部是可以直接调用的。

解决方案 »

  1.   

    你可以用 this.printName();
    如果直接调用printName(); ,相当于 window.printName(); JS是在全局变量是挂在window下,也window.可省略不写
     
      

  2.   

    这个不是类啊,是类的话
    <!DOCTYPE html>
    <html>
    <head>
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js">
    </script>
    <script>
    function Classes() {
        show = function() {
            alert('show');
        };
        this.showName = function() {
           show();//直接调用 
        }    
    }var classes = new Classes();
    classes.showName();
    </script>
    </head>
    <body>
    <p>如果您点击我,我会消失。</p>
    <p>点击我,我会消失。</p>
    <p>也要点击我哦。</p>
    </body>
    </html>
      

  3.   

    顶下1楼
    直接“printName()”,那么printGreeting函数在运行的时候就会从它的作用域中寻找名为printName的变量,找到后是函数就执行不是函数就报错(printGreeting的作用域有两个,一个是函数局部作用域,一个是全局作用域),函数里和全局中都没有找到printName,自然要报错“printName is not defined”。函数作为对象属性的时候无法在函数内直接调用对象方法,要靠this关键字调用,this指向的就是对象。
      

  4.   

    var methods = {
                    printName : function() {
                        console.log('Tom');
                    },
                    printGreeting : function() {
                        console.log('Hello');
                        // printName();
                        this.printName();
                    }
                };
     
      

  5.   

    this.printName(); this关键字引用的都是携带相应行为的DOM元素。