2009-01-19 11 views
124

मुझे जावास्क्रिप्ट की बहुत अच्छी समझ है, सिवाय इसके कि मैं "यह" चर सेट करने का एक अच्छा तरीका नहीं समझ सकता। विचार करें:आसानी से "यह" चर सेट करें?

var myFunction = function(){ 
    alert(this.foo_variable); 
} 

var someObj = document.body; //using body as example object 
someObj.foo_variable = "hi"; //set foo_variable so it alerts 

var old_fn = someObj.fn; //store old value 
someObj.fn = myFunction; //bind to someObj so "this" keyword works 
someObj.fn();    
someObj.fn = old_fn;  //restore old value 

क्या अंतिम 4 लाइनों के बिना ऐसा करने का कोई तरीका है? यह बल्कि कष्टप्रद है ... मैं एक गुमनाम समारोह है, जो मैंने सोचा था कि सुंदर और चतुर था बंधन की कोशिश की है, लेकिन कोई लाभ नहीं हुआ:

var myFunction = function(){ 
    alert(this.foo_variable); 
} 

var someObj = document.body;  //using body as example object 
someObj.foo_variable = "hi";  //set foo_variable so it alerts 
someObj.(function(){ fn(); })(); //fail. 

जाहिर है, myfunction में चर गुजर एक विकल्प है ... लेकिन यह है कि है इस सवाल का मुद्दा नहीं।

धन्यवाद।

उत्तर

207

वहाँ दो तरीकों जावास्क्रिप्ट, call(), और apply() में सभी कार्यों के लिए परिभाषित कर रहे हैं। समारोह वाक्य रचना लगता है:

call(/* object */, /* arguments... */); 
apply(/* object */, /* arguments[] */); 

क्या इन कार्यों कर समारोह वे पर लागू किया गया था कहते हैं, इस करने के लिए वस्तु पैरामीटर का मान बताए है।

var myFunction = function(){ 
    alert(this.foo_variable); 
} 
myFunction.call(document.body); 
+3

इसके अलावा, यदि आप jQuery का उपयोग कर रहे हैं, तो आप '$ .proxy (function, element) 'का उपयोग कर सकते हैं ताकि जब भी वह Functio एन कहा जाता है, यह तत्व के संदर्भ में होगा। http://api.jquery.com/jquery.proxy/ –

54

मुझे लगता है कि आप call लिए देख रहे हैं:

myFunction.call(obj, arg1, arg2, ...); 

यह obj को this सेट के साथ myFunction कहता है।

वहाँ भी थोड़ा अलग विधि apply है, जो एक सरणी के रूप में समारोह पैरामीटर लेता है:

myFunction.apply(obj, [arg1, arg2, ...]); 
+1

देखें खंड 15.3.4.3, 15.3.4.4 और 10.1.8 ECMAScript भाषा विशिष्टता में: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf – some

15

आप ताकि आप इसे मूल बाद में फोन कर सकते हैं एक समारोह के लिए 'दुकान' this मूल्य चाहते हैं (उदाहरण के लिए यदि आप अब कि मूल्य के लिए पहुँच नहीं है जब), आप इसे उपलब्ध नहीं bind सकता है (सभी ब्राउज़रों हालांकि) में:

var bound = func.bind(someThisValue); 

// ... later on, where someThisValue is not available anymore 

bound(); // will call with someThisValue as 'this' 
+5

एफवाईआई 'बाइंड' आईई 9 +, एफएफ 4 +, सफारी 5.1.4+ और क्रोम 7+ [(स्रोत)] में स्पष्ट रूप से उपलब्ध है (http: //kangax.github। कब/es5-compat-तालिका/# Function.prototype.bind)। आप किसी अज्ञात फ़ंक्शन पर सीधे बाध्य भी कॉल कर सकते हैं: 'var myFunction = function() {/ * यह = कुछ * /}। बाइंड (कुछ); ' – Adam

0

कैसे this बाध्य करने पर मेरे खोज मुझे यहाँ लाया इसलिए मैं अपने निष्कर्ष पोस्टिंग कर रहा हूँ: 'ECMAScript 2015' में हम भी इस तीर कार्यों lexically उपयोग करने के लिए सेट कर सकते हैं।

देखें: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions

बजाय:

function Person() { 
    setInterval(function growUp() { 
    // The callback refers to the `self` variable of which 
    // the value is the expected object. 
    this.age++; 
    }.bind(this), 1000); 
} 

अब हम कर सकते हैं:

function Person(){ 
    this.age = 0; 

    setInterval(() => { 
    this.age++; // |this| properly refers to the person object 
    }, 1000); 
} 

var p = new Person(); 
संबंधित मुद्दे