2010-04-27 11 views
8

पर मेरे पास निम्न कोड है। मुझे अपने फायरबग कंसोल पर "संग्रह" ऑब्जेक्ट देखने की उम्मीद है, लेकिन मुझे विंडो ऑब्जेक्ट दिखाई देता है। क्या यह सामान्य है?जावास्क्रिप्ट इस बिंदु को विंडो ऑब्जेक्ट

var archive = function(){} 

archive.prototype.action = { 
    test: function(callback){ 
     callback(); 
    }, 
    test2: function(){ 
     console.log(this); 
    } 
} 

var oArchive = new archive(); 
oArchive.action.test(oArchive.action.test2); 

उत्तर

6

oArchive.action.test2 आप एक समारोह है कि callback तो के लिए अंक के लिए एक संदर्भ हो जाता है, लेकिन यह है कि समारोह तो callback() का उपयोग कर कहा जाता है, जिसका अर्थ है कि यह एक तरीके के रूप में नहीं बुलाया जाता है और इसलिए this वैश्विक वस्तु है। मुख्य बिंदु यह है कि this किसी फ़ंक्शन से बाध्य नहीं है: यह निर्धारित किया जाता है कि फ़ंक्शन को कैसे कहा जाता है।

इस मामले में आप स्पष्ट रूप से कॉलबैक फ़ंक्शन के call या apply विधि का उपयोग कर कार्रवाई करने के लिए वस्तु this बिंदु (लेकिन संग्रह वस्तु) कर सकता है:

test: function(callback) { 
    callback.call(this); 
}, 

यह this संग्रह वस्तु होने के लिए प्राप्त करने के लिए इसके बजाय, आपको संग्रह वस्तु को पास करने की आवश्यकता होगी:

var archive = function(){} 

archive.prototype.action = { 
    test: function(callback, archive){ 
     callback.call(archive); 
    }, 
    test2: function(){ 
     console.log(this); 
    } 
} 

var oArchive = new archive(); 
oArchive.action.test(oArchive.action.test2, oArchive); 
संबंधित मुद्दे