2012-01-18 17 views
36

मैं एक लैम्ब्डा फ़ंक्शन बना रहा हूं जो एक ठोस पैराम के साथ एक दूसरा फ़ंक्शन निष्पादित करता है। यह कोड फ़ायरफ़ॉक्स में काम करता है लेकिन क्रोम में नहीं, इसका इंस्पेक्टर एक अजीब त्रुटि दिखाता है, Uncaught TypeError: Illegal invocation। मेरे कोड में क्या गलत है?Uncaught TypeError: जावास्क्रिप्ट में अवैध आमंत्रण

var make = function(callback,params){ 
    callback(params); 
} 

make(console.log,'it will be accepted!'); 
+1

अगर मैं 'console.log'' console.log.bind के साथ बदलें (कंसोल) ', यह क्रोम 12. –

+2

में काम करता है @ डी-कि इंगित करता है कि * लॉग * की एक विधि के रूप में कहा जा करने की उम्मीद * कंसोल *, यानी कि इसका * यह * कीवर्ड * कंसोल * ऑब्जेक्ट का संदर्भ लेना चाहिए। – RobG

+0

आपका 'मेक' फ़ंक्शन 'कॉलबैक.call (शून्य, पैराम्स) ' –

उत्तर

63

सांत्वना की लॉग समारोह this कंसोल (आंतरिक) का उल्लेख करने की उम्मीद है। ,

var x = {}; 
x.func = function(){ 
    if(this !== x){ 
     throw new TypeError('Illegal invocation'); 
    } 
    console.log('Hi!'); 
}; 
// Works! 
x.func(); 

var y = x.func; 

// Throws error 
y(); 

यहाँ एक (मूर्ख) उदाहरण है कि काम करेगा, क्योंकि यह आपके मेकअप समारोह में console को this बांधता है: इस कोड को जो आपकी समस्या को दोहराता है पर विचार करें

var make = function(callback,params){ 
    callback.call(console, params); 
} 

make(console.log,'it will be accepted!'); 

यह भी

काम करेंगे
var make = function(callback,params){ 
    callback(params); 
} 

make(console.log.bind(console),'it will be accepted!'); 
+0

स्पष्ट स्पष्टीकरण –

4

आप उस फ़ंक्शन को लपेट सकते हैं जिसे 'यह' एक नए लैम्ब्डा फ़ंक्शन में चाहिए, और फिर इसे अपने कॉलबैक फ़ंक्शन के लिए उपयोग करें।

function make(callback, params) { 
    callback(params); 
} 

make(function(str){ console.log(str); }, 'it will be accepted!'); 
संबंधित मुद्दे