JavaScript的this

  今天在看代码的时候,发现自己对this的理解还不是很透彻。

     

 1     (function(colors)
 2     {
 3         function sayHello()
 4         {
 5             console.log("private Hello");
 6         }
 7         colors.sayHello = function()
 8         {
 9             console.log("colors.sayHello");
10             sayHello();13         }
14 
15     })(window.colors = window.colors||{})

    如果,这样写,sayHello是指命名空间内的sayHello,log出来的是private Hello。可是如果改成下面这样的:

 1     (function(colors)
 2     {
 3         function sayHello()
 4         {
 5             console.log("private Hello");
 6         }
 7         colors.sayHello = function()
 8         {
 9             console.log("colors.sayHello");11             this.sayHello();13         }
14 
15     })(window.colors = window.colors||{})

  这样的sayHello指的是colors.sayHello,因此会出现不断地重复调用,直到栈溢出。这里的this,其实等价于window.colors这个。

  因此,下面的写法和上面的写法完全一样:

    (function(colors)
    {
        function sayHello()
        {
            console.log("private Hello");
        }
        colors.sayHello = function()
        {
            console.log("colors.sayHello");
            colors.sayHello();
        }

    })(window.colors = window.colors||{})

之所以会看到这个问题,是在这里:http://yuiblog.com/blog/2007/06/12/module-pattern/

 1 return  {
 2 
 3         aDragObjects: [], //a publicly accessible place to store our DD objects
 4         
 5         init: function () {
 6             //we'll defer making list items draggable until the DOM is fully loaded:
 7             yue.onDOMReady(this.makeLIsDraggable, this, true);
 8         },
 9         
10         makeLIsDraggable: function () {
11             var aListItems = getListItems(); //these are the elements we'll make draggable
12             for (var i=0, j=aListItems.length; i<j; i++) {
13                 this.aDragObjects.push(new YAHOO.util.DD(aListItems[i]));
14             }
15         }
16 
17     };
posted @ 2012-08-20 20:49  AntWu  阅读(175)  评论(0编辑  收藏  举报