2013-07-16 11 views
6

लागू करना लागू करना मैं इस अजीबता से फंस गया।जावास्क्रिप्ट फ़ंक्शन:

मान लीजिए मैं इस सरणी है:

var array = [{ 
    something: 'special' 
}, 'and', 'a', 'bunch', 'of', 'parameters']; 

मैं एक समारोह के apply विधि जा रहा है {something: 'special'}this वस्तु और मानकों array के बाकी होने के साथ समारोह आह्वान करने के लिए apply सकते हैं?

दूसरे शब्दों में, मैं इस

var tester = function() { 
    console.log('this,', this); 
    console.log('args,', arguments); 
}; 
tester.apply.apply(tester, array); 

करते हैं और उम्मीद करते हैं आउटपुट निम्नलिखित होने के लिए कर सकता है?

> this, {"something": "special"} 
> args, {"0": "and", "1": "a", "2": "bunch", "3": "of", "4": "parameters"} 

मैंने कोशिश की।

TypeError: Function.prototype.apply: Arguments list has wrong type 

लेकिन क्यों? ऐसा लगता है कि यह काम करना चाहिए।

+0

tester.apply (परीक्षक, सरणी); क्या आप चाहते हैं ... – dandavis

+2

@ दंडवीस वास्तव में नहीं। 'This' का मान 'सरणी [0]' होना चाहिए, और पारित तर्क 'सरणी [1]' सरणी [लेन -1] ' – Ian

+0

@Ian: क्षमा करें, गलत समझा जाना चाहिए। eval.call.apply (परीक्षक, सरणी) काम करता है, क्योंकि आप कॉल को लागू करना चाहते हैं (अभी तक भ्रमित, हे) .. – dandavis

उत्तर

11

लेकिन क्यों?

के अपने कॉल कदम-दर-कदम को कम करते हैं:

tester.apply.apply(tester, array) // resolves to 
(Function.prototype.apply).apply(tester, array) // does a 
tester.apply({something: 'special'}, 'and', 'a', 'bunch', 'of', 'parameters'); 

यहाँ आप देख सकते हैं कि गलत हो रहा है। सही

var array = [ 
    {something: 'special'}, 
    ['and', 'a', 'bunch', 'of', 'parameters'] 
]; 

हो तो apply.apply(tester, array) बन जाएगा होगा

tester.apply({something: 'special'}, ['and', 'a', 'bunch', 'of', 'parameters']); 

जो अपने मूल array के साथ एक

tester.call({something: 'special'}, 'and', 'a', 'bunch', 'of', 'parameters'); 

तो करता है आप का उपयोग करना होगा

(Function.prototype.call).apply(tester, array) 
+0

आप आलसी हो सकते हैं: Function.prototype.call === Function.call === true – dandavis

+0

या, वास्तव में, 'tester.call' – Dancrumb

+0

मैं eval का उपयोग करता हूं क्योंकि यह विश्वसनीय है और शिफ्ट के बिना केवल 4 अक्षर (दिनांक और atob के विपरीत) ... – dandavis

0

लागू विधि this संदर्भ और तर्कों के लिए एक तर्क के लिए एक तर्क लेती है, जिसे आप आवेदन करना चाहते हैं। दूसरा तर्क एक सरणी होना चाहिए।

tester.apply.apply(tester, array); 

दूसरा लागू विधि के कारण, पहले इस तरह कहा जाता है जाएगा:

tester.apply({something: 'special'}, 'and', 'a', 'bunch', 'of', 'parameters'); 

और चूंकि 'और' एक सरणी नहीं है, आप लेखन त्रुटि है कि आप वर्णित मिलता है। आप आसानी से call विधि का उपयोग कर इसे ठीक कर सकते हैं:

tester.call.apply(tester, array); 

call एक सरणी है, जो वांछित परिणाम में परिणाम देगा के बजाय व्यक्तिगत तर्क का समय लगेगा।

संबंधित मुद्दे