2015-06-11 7 views
5

जावास्क्रिप्ट में, यदि आप किसी असाइनमेंट अभिव्यक्ति के बाईं ओर किसी प्रकार की अभिव्यक्ति डालते हैं, तो इंजन एक संदर्भ त्रुटि फेंक देगा। उदाहरण के लिए,क्या जावास्क्रिप्ट में एल-वैल्यू और आर-वैल्यू की अवधारणा है?

// 'this' on the left side 
this = window; // ReferenceError: Invalid left-hand side in assignment 

या

// function call expression on the left side 
var a; 
var fn = function() {return a}; 
a === fn(); // true 
a = 1; // 1 
fn() = 5; // ReferenceError: Invalid left-hand side in assignment 

या

var a; 
a = 1; // 1 
(a) = 2; // 2 
(1, a) = 3; // ReferenceError: Invalid left-hand side in assignment 

मेरे प्रश्न हैं:

  1. करता जावास्क्रिप्ट भी एल-मूल्य और R- की अवधारणा है सी के रूप में मूल्य?

  2. असाइनमेंट अभिव्यक्ति के बाईं ओर फ़ंक्शन कॉल अभिव्यक्ति क्यों नहीं दिखाई दे सकती है? उपर्युक्त उदाहरण में, a === fn() के बाद, a = 5 और fn() = 5 के बीच क्या अंतर है। मुझे पता है कि ES5 spec यह जरूरी है, लेकिन यह इस तरह क्यों डिजाइन किया गया है?

+0

'fn()' एक अभिव्यक्ति है और एक चर संदर्भ नहीं है, और आप उस पर कुछ भी असाइन नहीं कर सकते हैं। –

+0

लेकिन मूल्यांकन आदेश बाएं से दाएं है, अगर 'एफएन()' का मूल्यांकन पहले किया जाता है, तो यह 'f'() === a' के बाद से 'ए' वापस कर देगा। और 'ए' एक चर है और मूल्यों को स्टोर कर सकता है। –

+5

यह वैरिएबल के संदर्भ में नहीं है, –

उत्तर

2

specification of assignments के अनुसार, निम्नलिखित भाव एक काम के लिए लक्ष्य के रूप में मान्य नहीं हैं

this = "bar"; // this 
"foo" = "bar"; // Literal 
/foo/ = "bar"; // RegularExpressionLiteral 
["foo"] = "bar"; // ArrayLiteral 
0

तथ्य यह है कि f(), एक संदर्भ के लिए मूल्यांकन कर सकते हैं मामले में आप समारोह कॉल करने से पहले a को कोई चीज असाइन करते हैं, तथ्य यह है कि f() एक अभिव्यक्ति (उदाहरण के 1+a के लिए के रूप में ही) है नहीं बदलता है। और असाइनमेंट केवल एक चर पर लागू किया जा सकता है। MDN

+0

हाय @ किरील, उत्तर के लिए धन्यवाद। 'और असाइनमेंट केवल एक चर पर लागू किया जा सकता है।' मुझे नहीं लगता कि यह सही है। आप चर से अलग संपत्ति और सरणी तत्व ऑब्जेक्ट करने के लिए निश्चित रूप से असाइनमेंट लागू कर सकते हैं। –

+0

@ leslie.zhang व्यावहारिक रूप से बोलते हुए, ऑब्जेक्ट गुण और सरणी तत्वों को परिवर्तनीय संदर्भ के रूप में देखा जा सकता है और इस प्रकार असाइनमेंट के लिए उपयोग किया जा सकता है। –

0

इसी तरह, जावास्क्रिप्ट भाषा के विश्व ध्यान में रखते हुए, "this(जरूरी ...) पवित्र है।"

उद्देश्य, और इसलिए this चर के वर्तमान मूल्य, कार्यक्रमों द्वारा मनमाने ढंग से संशोधन से आवश्यक रूप से संरक्षित है।

इसी प्रकार, "आप बस नहीं कह सकते कि 'एक समारोह,' जो कुछ भी है, '' 5 'के बराबर है।" (जाहिर है, इनमें से एक "फ़ंक्शन" है, और दूसरा "पूर्णांक निरंतर" है, और इसलिए, "कभी भी दो बार मिलेंगे।")

जावास्क्रिप्ट दुभाषिया, हर दूसरे भाषा-दुभाषिया की तरह इस ग्रह को उसी भाषा-कार्यान्वयन रणनीतियों (और उपकरण ...) का उपयोग करके डिजाइन और बनाया गया था, जिसकी खोज कभी भी आविष्कार की गई है।

this 
Literal 
ArrayLiteral 
ObjectLiteral 
FunctionExpression 
ClassExpression 
GeneratorExpression 
RegularExpressionLiteral 
TemplateLiteral 

उदाहरण के लिए, निम्न कार्य अमान्य भी कर रहे हैं::

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