You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/99-js-misc/04-reference-type/article.md
+39-43Lines changed: 39 additions & 43 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -2,14 +2,14 @@
2
2
# Reference Type
3
3
4
4
```warn header="In-depth language feature"
5
-
This article covers an advanced topic, to understand certain edge-cases better.
5
+
این مقاله در دسته بندی مباحث پیشرفته است, برای فهم آن باید به مباحث پایه مسلط باشید.
6
6
7
-
It's not important. Many experienced developers live fine without knowing it. Read on if you want to know how things work under the hood.
7
+
ممکن است این مباحث زیاد مهم نباشند چون خیلی از برنامه نویسان باتجربه ای هستند که کارشان به خوبی پیش میرود و این مباحث را نمیدانند. اگر علاقه مند به دانستن اینکه دستورات چگونه کار میکنند هستید بخوانید.
8
8
```
9
9
10
-
A dynamically evaluated method call can lose `this`.
10
+
با فراخوانی یک متد به صورت پویا و داینامیک ممکن است مقدار `this` از دست برود.
11
11
12
-
For instance:
12
+
به عنوان مثال:
13
13
14
14
```js run
15
15
let user = {
@@ -18,42 +18,40 @@ let user = {
18
18
bye() { alert("Bye"); }
19
19
};
20
20
21
-
user.hi(); //works
21
+
user.hi(); //کار میکند!
22
22
23
23
// now let's call user.hi or user.bye depending on the name
24
24
*!*
25
25
(user.name=="John"?user.hi:user.bye)(); // Error!
26
26
*/!*
27
27
```
28
28
29
-
On the last line there is a conditional operator that chooses either `user.hi`or `user.bye`. In this case the result is `user.hi`.
29
+
در خط آخر ما شرط سه تایی (تک خطی) را داریم که براساس true یا false بودن مقدار `user.name` مشخص میشود که آیا متد `user.hi`اجرا میشود یا `user.bye`. نتیجه درست است و `user.hi` برگردانده میشود ولی چون متد پرانتز ندارد درهنگام اجرا با مشکل روبرو خواهیم بود.
30
30
31
-
Then the method is immediately called with parentheses `()`. But it doesn't work correctly!
31
+
همانطور که میبینید هنگام اجرا به ارور برخورد کردیم. چون مقدار `"this"` برابر با `undefined` است.
32
32
33
-
As you can see, the call results in an error, because the value of `"this"` inside the call becomes `undefined`.
34
-
35
-
This works (object dot method):
33
+
کد زیر کار میکند (آبجکت با عملگر نقطه):
36
34
```js
37
35
user.hi();
38
36
```
39
-
40
-
This doesn't (evaluated method):
37
+
اما این کد اصلا! (فانکشن بدون پرانتز)
41
38
```js
42
-
(user.name=="John"?user.hi:user.bye)(); //Error!
39
+
(user.name=="John"?user.hi:user.bye)(); //خطا!
43
40
```
44
41
45
-
Why? If we want to understand why it happens, let's get under the hood of how `obj.method()` call works.
42
+
چرا؟ اگر متوجه شدید که تا اینجا چه اتفاقی افتاده, بیایید به عملکرد `()obj.method` بپردازیم.
46
43
47
-
## Reference type explained
44
+
## توضیحات درباره Reference type
48
45
49
-
Looking closely, we may notice two operations in `obj.method()` statement:
46
+
نگاه کنید. عبارت `()obj.method` دو عملگر داخل خود دارد:
50
47
51
-
1.First, the dot`'.'`retrieves the property `obj.method`.
52
-
2.Then parentheses`()`execute it.
48
+
1.ابتدا, عملگر نقطه`'.'`ویژگی `obj.method` را پیدا میکند.
49
+
2.سپس پرانتز`()`آن را اجرا میکند.
53
50
54
-
So, how does the information about `this` get passed from the first part to the second one?
55
51
56
-
If we put these operations on separate lines, then `this` will be lost for sure:
52
+
خب پس چگونه اطلاعات مربوط به `this` از قسمت اول به دوم منتقل میشود؟
53
+
54
+
اگر ما این سوال هارا در خط های جداگانه ای قرار بدهیم, مطمئنا مقدار `this` از دست خواهد رفت:
57
55
58
56
```js run
59
57
let user = {
@@ -62,47 +60,45 @@ let user = {
62
60
};
63
61
64
62
*!*
65
-
//split getting and calling the method in two lines
63
+
//اگر به این صورت در دو خط جدا متد را صدا بزنیم:
66
64
let hi =user.hi;
67
-
hi(); //Error, because this is undefined
65
+
hi(); //است undefiend برابر با this خطا! چون مقدار
68
66
*/!*
69
67
```
70
68
71
-
Here `hi = user.hi` puts the function into the variable, and then on the last line it is completely standalone, and so there's no `this`.
72
-
73
-
**To make `user.hi()` calls work, JavaScript uses a trick -- the dot `'.'` returns not a function, but a value of the special [Reference Type](https://tc39.github.io/ecma262/#sec-reference-specification-type).**
69
+
در اینجا `hi = user.hi` تابع را در متغیر میریزد و چون خط آخر مستقل و از نظر جاوااسکریپت دستور جداگانه ای است به همین دلیل `this` وجود ندارد.
74
70
75
-
The Reference Type is a "specification type". We can't explicitly use it, but it is used internally by the language.
71
+
** برای اینکه دستور `()user.hi` درست کار کند, جاوااسکریپت برای آن یک راه حلی دارد. عملگر نقطه `'.'` نه فقط فانکشن بلکه مقدار خاصی از ریفرنس تایپ ها [Reference Type](https://tc39.github.io/ecma262/#sec-reference-specification-type) را برمیگرداند **
76
72
77
-
The value of Reference Type is a three-value combination `(base, name, strict)`, where:
73
+
ریفرنس تایپ ها یا نوع ارجاعی "نوع خاصی از داده ها یا specification type" هستند. ما نمیتوانیم به صورت مستقیم از آن استفاده کنیم ولی به صورت داخلی داخل زبان تعبیه شده و استفاده میشود
78
74
79
-
-`base` is the object.
80
-
-`name` is the property name.
81
-
-`strict` is true if `use strict` is in effect.
75
+
این نوع داده خاص شامل سه مقدار `(base, name, strict)` هست که:
76
+
-`base` یک آبجکت است
77
+
-`name` نام ویژگی آبجکت هست
78
+
- اگر `use strict` تعبیه شده باشد مقدار `strict` نیز true است.
82
79
83
-
The result of a property access `user.hi`is not a function, but a value of Reference Type. For `user.hi`in strict mode it is:
80
+
نه تنها مقدار `user.hi`فانکشن نیست بلکه نوع آن از نوع Reference type هست. `user.hi`در حالت strict mode به این صورت است:
84
81
85
82
```js
86
-
// Reference Type value
83
+
//مقدار Reference Type
87
84
(user, "hi", true)
88
85
```
86
+
وقتی که پرانتزی در Reference type ها صدا زده میشود, همه اطلاعات مربوط به اشیاء و متد فعلی را دریافت میکند و به درستی کلمه کلیدی `this` را مقداردهی میکند.
89
87
90
-
When parentheses `()` are called on the Reference Type, they receive the full information about the object and its method, and can set the right `this` (`user` in this case).
91
-
92
-
Reference type is a special "intermediary" internal type, with the purpose to pass information from dot `.` to calling parentheses `()`.
88
+
نوع Reference type یک نوع داده داخلی "واسط" با هدف انتقال اطلاعات مربوطه از عملگر نقطه `.` به پرانتز است
93
89
94
-
Any other operation like assignment `hi = user.hi`discards the reference type as a whole, takes the value of `user.hi`(a function) and passes it on. So any further operation "loses" `this`.
90
+
عملگری مانند عملگر انتساب (Assign) در `hi = user.hi`خاصیت Reference type را در متغیر جدید کنار میذارد و صرفا مقدار تابع `user.hi`برگردانده شده را میریزد. و سپس `this` مقدار خود را از دست میدهد.
95
91
96
-
So, as the result, the value of `this`is only passed the right way if the function is called directly using a dot `obj.method()`or square brackets `obj['method']()`syntax (they do the same here). There are various ways to solve this problem such as[func.bind()](/bind#solution-2-bind).
92
+
درنتیجه, تنها درصورتی مقدار `this`به درستی پاس میشود که مستقیما فانکشن را با استفاده از نقطه `obj.method()`یا براکت باز و بسته `obj['method']()`صدا بزنیم. راه های مختلفی برای رفع این مشکل هست مثل[func.bind()](/bind#solution-2-bind).
97
93
98
-
## Summary
94
+
## خلاصه مطلب
99
95
100
-
Reference Type is an internal type of the language.
96
+
تایپ مرجعی یا Reference Type ها نوع داده داخلی در زبان جاوااسکریپت هستند.
101
97
102
-
Reading a property, such as with dot `.`in `obj.method()` returns not exactly the property value, but a special "reference type" value that stores both the property value and the object it was taken from.
98
+
وقتی که یک ویژگی یا Peraperty مخصوصا توسط عملگر نقطه `.`در `()obj.method` خوانده میشود, نه تنها مقدار ویژگی بلکه مقادیر خاص مانند ویژگی ها یا توابع خاص را هم برمیگرداند.
103
99
104
-
That's for the subsequent method call `()` to get the object and set `this`to it.
100
+
بعد از اینکه متدی فراخوانی شد, عملگر پرانتز آبجکت را دریافت و `this`را مقداردهی میکند
105
101
106
-
For all other operations, the reference type automatically becomes the property value (a function in our case).
102
+
برای مابقی عملگر ها Reference Type تبدیل به مقدار ویژگی میشود (تابع هم همینطور)
107
103
108
-
The whole mechanics is hidden from our eyes. It only matters in subtle cases, such as when a method is obtained dynamically from the object, using an expression.
104
+
همه مکانیزم هایی که از چشم ما پنهان هستند, خیلی کم پیش میاید که از آن را مهم بدانیم و مطلع شویم که چطور کار میکنند. مانند زمانی که یک مقد به صورت پویا از طریق آبجکت و با استفاده از عبارت ها به دست میاید.
0 commit comments