Skip to content

Commit 3a4c855

Browse files
committed
Reference Type
1 parent b2c18a3 commit 3a4c855

5 files changed

Lines changed: 69 additions & 68 deletions

File tree

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,29 +1,29 @@
1-
**Error**!
1+
**خطأ**!
22

3-
Try it:
3+
حاول هذا:
44

55
```js run
66
let user = {
77
name: "John",
88
go: function() { alert(this.name) }
99
}
1010

11-
(user.go)() // error!
11+
(user.go)() // خطأ!
1212
```
1313

14-
The error message in most browsers does not give us much of a clue about what went wrong.
14+
لا تعطينا رسالة الخطأ في معظم المتصفحات الكثير من الأدلة حول الخطأ الذي حدث.
1515

16-
**The error appears because a semicolon is missing after `user = {...}`.**
16+
**يظهر الخطأ لأن فاصلة منقوطة مفقودة بعد `user = {...}`.**
1717

18-
JavaScript does not auto-insert a semicolon before a bracket `(user.go)()`, so it reads the code like:
18+
لا تقوم جافاسكريبت بإدراج فاصلة منقوطة تلقائيًا قبل قوس `()(user.go)`, إنها تقوم بقراءة الشيفرة هكذا:
1919

2020
```js no-beautify
2121
let user = { go:... }(user.go)()
2222
```
2323

24-
Then we can also see that such a joint expression is syntactically a call of the object `{ go: ... }` as a function with the argument `(user.go)`. And that also happens on the same line with `let user`, so the `user` object has not yet even been defined, hence the error.
24+
ثم يمكننا أن نرى أيضًا أن هذا التعبير المشترك هو عبارة عن استدعاء للكائن `{ go: ... }` كتابع مع متغير `(user.go)`. وهذا يحدث أيضًا على نفس السطر مع `let user`, لذلك `user` لم يتم حتى الآن تعريف الكائن ، ومن هنا كان الخطأ.
2525

26-
If we insert the semicolon, all is fine:
26+
إذا أدخلنا الفاصلة المنقوطة ، فكل شيء على ما يرام:
2727

2828
```js run
2929
let user = {
@@ -34,4 +34,5 @@ let user = {
3434
(user.go)() // John
3535
```
3636

37-
Please note that parentheses around `(user.go)` do nothing here. Usually they setup the order of operations, but here the dot `.` works first anyway, so there's no effect. Only the semicolon thing matters.
37+
يرجى ملاحظة أن الأقواس حول `(user.go)` لا تفعل شيئ هنا.عادة ما يقومون بإعداد ترتيب العمليات ، ولكن هنا النقطة
38+
`.` تعمل أولاً على أي حال, لذلك ليس هناك تأثير. فقط الشيء الفاصلة المنقوطة هو المهم.

1-js/99-js-misc/04-reference-type/2-check-syntax/task.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ importance: 2
22

33
---
44

5-
# Syntax check
5+
# فحص بناء الجملة
66

7-
What is the result of this code?
7+
ما هي نتيجة هذه الشيفرة?
88

99

1010
```js no-beautify
@@ -16,4 +16,4 @@ let user = {
1616
(user.go)()
1717
```
1818

19-
P.S. There's a pitfall :)
19+
ملاحظة. هناك مأزق :)
Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
11

2-
Here's the explanations.
2+
هنا يكون التفسير.
33

4-
1. That's a regular object method call.
4+
1. هذا هو استدعاء طريقة الكائن المعتاد.
55

6-
2. The same, parentheses do not change the order of operations here, the dot is first anyway.
6+
2. نفس الشيء ، الأقواس لا تغير ترتيب العمليات هنا ، النقطة أولاً على أي حال.
77

8-
3. Here we have a more complex call `(expression).method()`. The call works as if it were split into two lines:
8+
3. هنا لدينا تنفيذ اكثر تعقيداً `(expression).method()`. التنفيذ يعمل كما لو كان مقسوم الى سطرين:
99

1010
```js no-beautify
11-
f = obj.go; // calculate the expression
12-
f(); // call what we have
11+
f = obj.go; // حساب المصطلح
12+
f(); // تنفيذ ما لدينا
1313
```
1414

15-
Here `f()` is executed as a function, without `this`.
15+
هنا `f()` يتم تنفيذها كـ تابع, بدون `this`.
1616

17-
4. The similar thing as `(3)`, to the left of the dot `.` we have an expression.
17+
4. نفس الشيئ في `(3)`, ايسر النقطة `.` لدينا مصطلح.
1818

19-
To explain the behavior of `(3)` and `(4)` we need to recall that property accessors (dot or square brackets) return a value of the Reference Type.
19+
لتفسير سلوك `(3)` و `(4)` نريد إعادة تنفيذ مدخلات الخاصية (نقطة او اقواس مربعة) تعيد قيمة النوع المرجعي.
2020

21-
Any operation on it except a method call (like assignment `=` or `||`) turns it into an ordinary value, which does not carry the information allowing to set `this`.
21+
اى عملية عليها عدا تنفيذ التابع (مثل `=` or `||`) يحولها إلى قيمة عادية ، لا تحمل المعلومات التي تسمح بتعيينها `this`.
2222

1-js/99-js-misc/04-reference-type/3-why-this/task.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ importance: 3
22

33
---
44

5-
# Explain the value of "this"
5+
# تفسير القيمة الخاصه بـ "this"
66

7-
In the code below we intend to call `obj.go()` method 4 times in a row.
7+
في الشيفرة بالأسفل نريد تنفيذ `obj.go()` 4 مرات.
88

9-
But calls `(1)` and `(2)` works differently from `(3)` and `(4)`. Why?
9+
لكن تنفيذ `(1)` و `(2)` يكون مختلف عن تنفيذ `(3)` 4 `(4)`. لماذا?
1010

1111
```js run no-beautify
1212
let obj, method;
Lines changed: 43 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11

2-
# Reference Type
2+
# النوع المرجعي
33

4-
```warn header="In-depth language feature"
5-
This article covers an advanced topic, to understand certain edge-cases better.
4+
```warn header="خصائص متقدمه فى اللغه"
5+
هذه المقالة تقوم بتغطية موضوع متقدم, لفهم بعض الحالات بشكل أفضل.
66
7-
It's not important. Many experienced developers live fine without knowing it. Read on if you're want to know how things work under the hood.
7+
إنها ليست مهمة. يعيش العديد من المطورين ذوي الخبرة بشكل جيد دون معرفة ذلك. تابع القراءة إذا كنت تريد معرفة كيفية عمل الأشياء خلف الكواليس.
88
```
99

10-
A dynamically evaluated method call can lose `this`.
10+
قد تفقد استدعاء تابع تم تقييمه بشكل ديناميكي `this`.
1111

12-
For instance:
12+
علي سبيل المثال:
1313

1414
```js run
1515
let user = {
@@ -18,42 +18,42 @@ let user = {
1818
bye() { alert("Bye"); }
1919
};
2020

21-
user.hi(); // works
21+
user.hi(); // تعمل
2222

23-
// now let's call user.hi or user.bye depending on the name
23+
// الآن دعونا نقوم بتشغيل user.hi أو user.bye بناءً علي الإسم
2424
*!*
2525
(user.name == "John" ? user.hi : user.bye)(); // Error!
2626
*/!*
2727
```
2828

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+
على السطر الأخير يوجد عامل شرطي يختار إما `user.hi` أو `user.bye`. فى هذه الحالة تكون النتيجة `user.hi`.
3030

31-
Then the method is immediately called with parentheses `()`. But it doesn't work correctly!
31+
ثم يتم استدعاء التابع على الفور بين قوسين `()`. و لكنه لم يعمل بشكل صحيح!
3232

33-
As you can see, the call results in an error, because the value of `"this"` inside the call becomes `undefined`.
33+
كما ترى, تشغيل التابع أحدث خطأ, بسبب أن نتيجة `"this"` داخل تشغيل التابع أنتج `undefined`.
3434

35-
This works (object dot method):
35+
هذا يعمل (كائن نقطة تابع):
3636
```js
3737
user.hi();
3838
```
3939

40-
This doesn't (evaluated method):
40+
هذا لا يعمل:
4141
```js
42-
(user.name == "John" ? user.hi : user.bye)(); // Error!
42+
(user.name == "John" ? user.hi : user.bye)(); // خطأ!
4343
```
4444

45-
Why? If we want to understand why it happens, let's get under the hood of how `obj.method()` call works.
45+
لماذ ؟ إذا كنا نريد ان نفهم لماذا يحدث هذا, دعونا نري خلف الكواليس كيف يعمل `()obj.method`.
4646

47-
## Reference type explained
47+
## تفسير النوع المرجعي
4848

49-
Looking closely, we may notice two operations in `obj.method()` statement:
49+
عند التدقيق, ربما نلاحظ وجود عمليتين علي عبارة `()obj.method`:
5050

51-
1. First, the dot `'.'` retrieves the property `obj.method`.
52-
2. Then parentheses `()` execute it.
51+
1. اولاً, النقطة `'.'` تجب الخاصية `obj.method`.
52+
2. ثانياً الأقواس `()` تقوم بتشغيلها.
5353

54-
So, how does the information about `this` get passed from the first part to the second one?
54+
لذا, كيف يمكن للمعلومات الخاصة بـ `this` ان تمر من الجزء الأول الى الجزء الثاني?
5555

56-
If we put these operations on separate lines, then `this` will be lost for sure:
56+
إذا وضعنا هذه العمليات على خطوط منفصلة, اذا `this` سوف نقوم بفقدها بالتأكيد:
5757

5858
```js run
5959
let user = {
@@ -62,53 +62,53 @@ let user = {
6262
}
6363

6464
*!*
65-
// split getting and calling the method in two lines
65+
// تقسيم الحصول على واستدعاء التابع في سطرين
6666
let hi = user.hi;
67-
hi(); // Error, because this is undefined
67+
hi(); // خطأ, لأن this غير معرفة
6868
*/!*
6969
```
7070

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`.
71+
هنا `hi = user.hi` يضع التابع في المتغير, ثم في السطر الأخير يكون مستقلاً تماماً, و في هذه الحالة لا يوجد `this`.
7272

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).**
73+
**لجعل `()user.hi` تعمل, جافاسكريبت تستخدم خدعة -- النقطة `'.'` لا تيعد تابع, و لكن قيمه من المميز [Reference Type](https://tc39.github.io/ecma262/#sec-reference-specification-type).**
7474

75-
The Reference Type is a "specification type". We can't explicitly use it, but it is used internally by the language.
75+
النوع المرجعي هو "نوع المواصفات". لا يمكننا استخدامها صراحة, و لكن يتم استخدامها داخلياً بواسطة اللغه.
7676

77-
The value of Reference Type is a three-value combination `(base, name, strict)`, where:
77+
قيمة النوع المرجعي هي مزيج من ثلاث قيم `(base, name, strict)`, حيث:
7878

79-
- `base` is the object.
80-
- `name` is the property name.
81-
- `strict` is true if `use strict` is in effect.
79+
- `base` الكائن.
80+
- `name` إسم الخاصية.
81+
- `strict` تكون صحيحة اذا `use strict` تعمل.
8282

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:
83+
النتيجة من إستخدام `user.hi` لا يكون تابع, و لكن قيمة من النوع المرجعي. `user.hi` في الوضع الصارم تكون:
8484

8585
```js
86-
// Reference Type value
86+
// قيمة النوع المرجعي
8787
(user, "hi", true)
8888
```
8989

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).
90+
حيث الأقواس `()` تسمى النوع المرجعي, يتلقون المعلومات الكاملة حول الكائن و توابعه, و يمكن وضع القيمه الصحيحة لـ `this` (`=user` في هذه الحالة).
9191

92-
Reference type is a special "intermediary" internal type, with the purpose to pass information from dot `.` to calling parentheses `()`.
92+
النوع المرجعي هو نوع داخلي خاص "وسيط", بغرض تمرير المعلومات من النقطة `.` الي طلب الأقواس `()`.
9393

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`.
94+
اى عملية اخري مثل `hi = user.hi` تتجاهل النوع المرجعي بالكامل, تأخذ القيمة من `user.hi` (التابع) و تقوم بتمريره. اذا اى من العمليات المستقبلية "تفقد" `this`.
9595

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). Later in this tutorial, we will learn various ways to solve this problem such as [func.bind()](/bind#solution-2-bind).
96+
لذا, قيمة `this` يتم تمريرها بالطريقة الصحيحة فقط إذا تم استدعاء التابع مباشرةً باستخدام نقطة `obj.method()` أو الاقواس المربعة `obj['method']()` (يقومون بنفس الوظيفه هنا). لاحقًا في هذا البرنامج التعليمي ، سنتعلم طرقًا مختلفة لحل هذه المشكلة مثل [func.bind()](/bind#solution-2-bind).
9797

98-
## Summary
98+
## الملخص
9999

100-
Reference Type is an internal type of the language.
100+
النوع المرجعي هو نوع داخلي من اللغة.
101101

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.
102+
قراءة خاصية ، كما هو الحال مع النقطة `.` في `obj.method()` لا يعيد قيمة الخاصية بالضبط, و لكن "النوع المرجعي" كلاً من قيمة الخاصية والكائن الذي تم أخذها منه.
103103

104-
That's for the subsequent method call `()` to get the object and set `this` to it.
104+
هذا لاستدعاء الطريقة اللاحقة `()` للوصل الى الكائن و وضع قيمة `this` بها.
105105

106-
For all other operations, the reference type automatically becomes the property value (a function in our case).
106+
بالنسبة لجميع العمليات الأخرى ، يصبح النوع المرجعي تلقائيًا قيمة الخاصية (تابع في حالتنا).
107107

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.
108+
جميع آليات العمل مختفيه. لا يهم إلا في الحالات الدقيقة, مثل عندما يتم الحصول على طريقة ديناميكيًا من الكائن ، باستخدام تعبير.
109109

110110

111111

112112

113113

114-
result of dot `.` isn't actually a method, but a value of `` needs a way to pass the information about `obj`
114+
نتيجة النقطة `.` ليست في الواقع طريقة ، ولكنها قيمة `` يحتاج إلى طريقة لتمرير المعلومات حول `obj`

0 commit comments

Comments
 (0)