क्या हम एक चर के संदर्भ को पारित कर सकते हैं जो एक फ़ंक्शन में तर्क के रूप में अपरिवर्तनीय है?
उदाहरण:
var x = 0;
function a(x)
{
x++;
}
a(x);
alert(x); //Here I want to have 1 instead of 0
क्या हम एक चर के संदर्भ को पारित कर सकते हैं जो एक फ़ंक्शन में तर्क के रूप में अपरिवर्तनीय है?
उदाहरण:
var x = 0;
function a(x)
{
x++;
}
a(x);
alert(x); //Here I want to have 1 instead of 0
जवाबों:
चूंकि जावास्क्रिप्ट संदर्भ से गुजरने वाले मापदंडों का समर्थन नहीं करता है, आपको इसके बजाय चर को एक वस्तु बनाने की आवश्यकता होगी:
var x = {Value: 0};
function a(obj)
{
obj.Value++;
}
a(x);
document.write(x.Value); //Here i want to have 1 instead of 0
इस मामले में, xएक वस्तु का एक संदर्भ है। जब xफ़ंक्शन को पास किया जाता है a, तो उस संदर्भ को कॉपी किया जाता है obj। इस प्रकार, objऔर xस्मृति में एक ही बात को देखें। की Valueसंपत्ति को objप्रभावित करने वाली Valueसंपत्ति को बदलना x।
जावास्क्रिप्ट हमेशा मान से फ़ंक्शन पैरामीटर पारित करेगा। यह बस भाषा का एक विनिर्देश है। आप दोनों कार्यों के लिए एक स्कोप लोकल में बना सकते हैं x, और बिल्कुल वैरिएबल पास नहीं कर सकते।
यह प्रश्न मदद कर सकता है: जावास्क्रिप्ट में संदर्भ द्वारा चर कैसे पारित करें? ActiveX फ़ंक्शन से डेटा पढ़ें जो एक से अधिक मान लौटाता है
संक्षेप में, जावास्क्रिप्ट आदिम प्रकार हमेशा मूल्य द्वारा पारित किए जाते हैं, जबकि वस्तुओं के अंदर के मूल्य संदर्भ द्वारा पारित किए जाते हैं (मेरी ओवरसाइट को इंगित करने के लिए टिप्पणीकारों के लिए धन्यवाद)। इसलिए इसे पूरा करने के लिए, आपको अपना पूर्णांक किसी वस्तु के अंदर रखना होगा:
var myobj = {x:0};
function a(obj)
{
obj.x++;
}
a(myobj);
alert(myobj.x); // returns 1
xमूल्य से गुजरते हैं , चाहे xवह एक वस्तु हो या न हो, आप इसे किसी अन्य तरीके से पूरे मूल्य के साथ नहीं बदल सकते हैं, जब कॉलर देखेंगे।
मैंने कुछ अलग तरीके से लागू किए गए पॉइंटर्स को पाया है जो कि सी परिप्रेक्ष्य से समझने के लिए संभवतः अधिक सामान्य और आसान है (और इस तरह उपयोगकर्ताओं के उदाहरण के प्रारूप में अधिक फिट बैठता है)।
जावास्क्रिप्ट में, सी की तरह, सरणी चर वास्तव में सरणी के लिए केवल संकेत हैं, इसलिए आप एक सरणी का उपयोग कर सकते हैं कि एक पॉइंटर घोषित करने के समान ही। इस तरह, आपके कोड के सभी पॉइंटर्स को उसी तरह से उपयोग किया जा सकता है, जबकि आपने मूल ऑब्जेक्ट में वैरिएबल का नाम दिया था।
यह पॉइंटर के पते और पॉइंटर के पते पर क्या है, के संदर्भ में दो अलग-अलग सूचनाओं का उपयोग करने की अनुमति देता है।
यहाँ एक उदाहरण है (मैं एक सूचक को दर्शाने के लिए अंडरस्कोर का उपयोग करता हूं):
var _x = [ 10 ];
function foo(_a){
_a[0] += 10;
}
foo(_x);
console.log(_x[0]);
पैदावार
output: 20
देर से जवाब लेकिन मैं बंद करने के माध्यम से संदर्भ द्वारा आदिम मूल्यों को पारित करने का एक तरीका भर आया हूं। यह एक पॉइंटर बनाने के बजाय जटिल है, लेकिन यह काम करता है।
function ptr(get, set) {
return { get: get, set: set };
}
function helloWorld(namePtr) {
console.log(namePtr.get());
namePtr.set('jack');
console.log(namePtr.get())
}
var myName = 'joe';
var myNamePtr = ptr(
function () { return myName; },
function (value) { myName = value; }
);
helloWorld(myNamePtr); // joe, jack
console.log(myName); // jack
ES6 में, लैम्बडा एक्सप्रेशन का उपयोग करने के लिए कोड को छोटा किया जा सकता है:
var myName = 'joe';
var myNamePtr = ptr(=> myName, v => myName = v);
helloWorld(myNamePtr); // joe, jack
console.log(myName); // jack
जावास्क्रिप्ट में जो एक वैश्विक होगा। हालाँकि, आपका कार्य इस तरह दिखाई देगा:
function a(){
x++;
};
चूंकि xवैश्विक संदर्भ में है, इसलिए आपको इसे फ़ंक्शन में पास करने की आवश्यकता नहीं है।
जावास्क्रिप्ट को बस पॉइंटर्स को मिश्रण में रखना चाहिए यह बहुत सारी समस्याओं को हल करता है। इसका मतलब है कि कोड एक अज्ञात चर नाम या चर का उल्लेख कर सकता है जो गतिशील रूप से बनाए गए थे। यह मॉड्यूलर कोडिंग और इंजेक्शन को भी आसान बनाता है।
यह वही है जो मैं निकटतम के रूप में देखता हूं आप व्यवहार में सी पॉइंटर्स पर आ सकते हैं
js में:
var a = 78; // creates a var with integer value of 78
var pointer = 'a' // note it is a string representation of the var name
eval (pointer + ' = 12'); // equivalent to: eval ('a = 12'); but changes value of a to 12
सी में:
int a = 78; // creates a var with integer value of 78
int pointer = &a; // makes pointer to refer to the same address mem as a
*pointer = 12; // changes the value of a to 12
यह असंभव हो सकता है क्योंकि जावास्क्रिप्ट में संदर्भ द्वारा एक आदिम प्राप्त करने के लिए पर्ल का "\" ऑपरेटर नहीं है, लेकिन इस पैटर्न का उपयोग करके एक आदिम के लिए "प्रभावी रूप से एक पॉइंटर" ऑब्जेक्ट बनाने का एक तरीका है।
यह समाधान तब सबसे ज्यादा मायने रखता है, जब आपके पास पहले से ही आदिम है (इसलिए आप इसे अन्य कोड को संशोधित करने की आवश्यकता के बिना किसी वस्तु में नहीं डाल सकते हैं), लेकिन फिर भी अपने कोड के अन्य भागों के लिए टिंकर को इसके लिए एक पॉइंटर पास करना होगा। अपने राज्य के साथ; तो आप अभी भी निर्बाध प्रॉक्सी का उपयोग करके इसके राज्य के साथ छेड़छाड़ कर सकते हैं जो एक सूचक की तरह व्यवहार करता है।
var proxyContainer = {};
// | attaches a pointer-lookalike getter/setter pair
// | to the container object.
var connect = function(container) {
// | primitive, can't create a reference to it anymore
var cant_touch_this = 1337;
// | we know where to bind our accessor/mutator
// | so we can bind the pair to effectively behave
// | like a pointer in most common use cases.
Object.defineProperty(container, 'cant_touch_this', {
'get': function() {
return cant_touch_this;
},
'set': function(val) {
cant_touch_this = val;
}
});
};
// | not quite direct, but still "touchable"
var f = function(x) {
x.cant_touch_this += 1;
};
connect(proxyContainer);
// | looks like we're just getting cant_touch_this
// | but we're actually calling the accessor.
console.log(proxyContainer.cant_touch_this);
// | looks like we're touching cant_touch_this
// | but we're actually calling the mutator.
proxyContainer.cant_touch_this = 90;
// | looks like we touched cant_touch_this
// | but we actually called a mutator which touched it for us.
console.log(proxyContainer.cant_touch_this);
f(proxyContainer);
// | we kinda did it! :)
console.log(proxyContainer.cant_touch_this);
जावास्क्रिप्ट में, आप किसी फ़ंक्शन के संदर्भ में चर पास नहीं कर सकते। हालाँकि आप किसी ऑब्जेक्ट को संदर्भ द्वारा पास कर सकते हैं।
मैं सोच रहा हूँ कि सी के विपरीत या संकेत के साथ किसी भी भाषा:
/** Javascript **/
var o = {x:10,y:20};
var o2 = {z:50,w:200};
।
o == o2 // obviously false : not the same address in memory
o <= o2 // true !
o >= o2 // also true !!
यह एक बहुत बड़ी समस्या है:
इसका मतलब है कि आप अपने आवेदन द्वारा बनाई गई (आवंटित) हर वस्तु को सूचीबद्ध / प्रबंधित कर सकते हैं,
वस्तुओं की उस विशाल सूची से, इन के बारे में कुछ जानकारी की गणना करें (उदाहरण के लिए उन्हें एक साथ कैसे जोड़ा जाता है)
लेकिन जब आप किसी विशिष्ट वस्तु के बारे में आपके द्वारा बनाई गई जानकारी को पुनः प्राप्त करना चाहते हैं, तो आप इसे अपनी विशाल सूची में डाइकोटॉमी द्वारा नहीं पा सकते हैं : प्रति ऑब्जेक्ट में कोई विशिष्ट पहचानकर्ता नहीं है जिसे वास्तविक स्मृति पते के प्रतिस्थापन के रूप में इस्तेमाल किया जा सकता है
अंत में इसका मतलब है कि यह एक बड़ी समस्या है, अगर आप जावास्क्रिप्ट में लिखना चाहते हैं:
जावास्क्रिप्ट संदर्भ द्वारा पारित होने वाले आदिम प्रकारों का समर्थन नहीं करता। एक समाधान है, यद्यपि।
एक वस्तु में पास होने के लिए आवश्यक सभी चर डालें। इस मामले में, वहाँ, केवल एक चर है x। चर को पारित करने के बजाय, चर नाम को स्ट्रिंग के रूप में पास करें, जो है "x"।
var variables = {x:0};
function a(x)
{
variables[x]++;
}
a("x");
alert(variables.x);
आप जो करना चाहते हैं, उसके आधार पर, आप बस चर नाम को बचा सकते हैं, और फिर बाद में इसे इस तरह एक्सेस कर सकते हैं:
function toAccessMyVariable(variableName){
alert(window[variableName]);
}
var myFavoriteNumber = 6;
toAccessMyVariable("myFavoriteNumber");
अपने विशिष्ट उदाहरण पर लागू होने के लिए, आप ऐसा कुछ कर सकते हैं:
var x = 0;
var pointerToX = "x";
function a(variableName)
{
window[variableName]++;
}
a(pointerToX);
alert(x); //Here I want to have 1 instead of 0
windowऑब्जेक्ट के लिए विशिष्ट है । इसके अलावा, वैश्विक चर का उपयोग करने की सिफारिश कम है, क्योंकि पहले से ही एक ही नाम के साथ एक चर हो सकता है।
यह सिर्फ संकेत का समर्थन नहीं करता है, कहानी का अंत :-(।
मैं यह जोड़ना चाहूंगा, जबकि मैं बिल्कुल नया हूं और C बैकग्राउंड से आ रहा हूं, जो मैं इवेंट लूप और स्टैक के बारे में पढ़ रहा हूं, आपको जो भी संभव हो, उसके कॉलर को जितना संभव हो उतना पास रखना चाहिए। जैसा कि मैं बिल्कुल नया हूं, मुझे यह गलत लग सकता है।
यहां बहुत सारे उत्तर इसे वैश्विक बनाने का सुझाव देते हैं, लेकिन फिर से अगर मैं सही तरीके से पढ़ रहा हूं, तो यह स्टैक हॉप्स को बढ़ा सकता है और एक तरह से संभवतः आपके ईवेंट लूप को अनावश्यक रूप से खंडित कर सकता है (जो कि वर्तमान में कहे गए ऑब्जेक्ट पर निर्भर करता है)।
इसके अलावा, किसी भी उदाहरण ने यह संकेत दिया है कि एक ही काम करने के लिए कई तरीकों से सिर्फ 1 संकेत मिलता है, जो कि सूचक नहीं होगा।
आपके उदाहरण में आपके पास वास्तव में एक ही नाम के 2 चर हैं। (ग्लोबल) वेरिएबल x और फंक्शन scoped वेरिएबल x। उस जावास्क्रिप्ट को देखने के लिए दिलचस्प है, जब एक ही नाम के 2 चर के साथ क्या करने का विकल्प दिया जाता है, तो फ़ंक्शन स्कोप किए गए नाम के साथ जाता है और आउट-ऑफ-स्कोप चर को अनदेखा करता है।
यह संभवत: सुरक्षित नहीं है कि जावास्क्रिप्ट हमेशा इस तरह से व्यवहार करेगा ...
चियर्स!
नहीं तुम नहीं कर सकते। ब्राउज़र सिस्टम मैमोरी और उसके वर्बल को यू एक्सेस नहीं देता है। यह नोड जैसे एनवायरमेंट के साथ संभव होना चाहिए, लेकिन ब्राउज़र के अंदर तब तक संभव नहीं है जब तक आप हैकर नहीं हैं।