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 };
思绪来得快去得也快,偶尔在这里停留。