Skip to content

Commit 4d663ac

Browse files
committed
fix(js): use Symbol in Function.prototype.myCall
1 parent d8aeee2 commit 4d663ac

File tree

3 files changed

+27
-21
lines changed

3 files changed

+27
-21
lines changed

JS/JS-br.md

+9-7
Original file line numberDiff line numberDiff line change
@@ -752,15 +752,16 @@ Consideramos implementar eles a partir das seguintes regras:
752752
```js
753753
Function.prototype.myCall = function (context) {
754754
var context = context || window
755+
var fn = Symbol('fn')
755756
// Adiciona uma propriedade ao `context`
756757
// getValue.call(a, 'yck', '24') => a.fn = getValue
757-
context.fn = this
758+
context[fn] = this
758759
// pega os parâmentros do `context`
759760
var args = [...arguments].slice(1)
760761
// getValue.call(a, 'yck', '24') => a.fn('yck', '24')
761-
var result = context.fn(...args)
762+
var result = context[fn](...args)
762763
// deleta fn
763-
delete context.fn
764+
delete context[fn]
764765
return result
765766
}
766767
```
@@ -770,18 +771,19 @@ O exemplo acima é a idéia central da simulação do `call`, e a implementaçã
770771
```js
771772
Function.prototype.myApply = function (context) {
772773
var context = context || window
773-
context.fn = this
774+
var fn = Symbol('fn')
775+
context[fn] = this
774776

775777
var result
776778
// Existe a necessidade de determinar se guarda o segundo parâmentro
777779
// Se o segundo parâmetro existir, espalhe ele
778780
if (arguments[1]) {
779-
result = context.fn(...arguments[1])
781+
result = context[fn](...arguments[1])
780782
} else {
781-
result = context.fn()
783+
result = context[fn]()
782784
}
783785

784-
delete context.fn
786+
delete context[fn]
785787
return result
786788
}
787789
```

JS/JS-ch.md

+9-7
Original file line numberDiff line numberDiff line change
@@ -1018,15 +1018,16 @@ getValue.apply(a, ['yck', '24'])
10181018
```js
10191019
Function.prototype.myCall = function (context) {
10201020
var context = context || window
1021+
var fn = Symbol('fn')
10211022
// 给 context 添加一个属性
10221023
// getValue.call(a, 'yck', '24') => a.fn = getValue
1023-
context.fn = this
1024+
context[fn] = this
10241025
// 将 context 后面的参数取出来
10251026
var args = [...arguments].slice(1)
10261027
// getValue.call(a, 'yck', '24') => a.fn('yck', '24')
1027-
var result = context.fn(...args)
1028+
var result = context[fn](...args)
10281029
// 删除 fn
1029-
delete context.fn
1030+
delete context[fn]
10301031
return result
10311032
}
10321033
```
@@ -1036,18 +1037,19 @@ Function.prototype.myCall = function (context) {
10361037
```js
10371038
Function.prototype.myApply = function (context) {
10381039
var context = context || window
1039-
context.fn = this
1040+
var fn = Symbol('fn')
1041+
context[fn] = this
10401042

10411043
var result
10421044
// 需要判断是否存储第二个参数
10431045
// 如果存在,就将第二个参数展开
10441046
if (arguments[1]) {
1045-
result = context.fn(...arguments[1])
1047+
result = context[fn](...arguments[1])
10461048
} else {
1047-
result = context.fn()
1049+
result = context[fn]()
10481050
}
10491051

1050-
delete context.fn
1052+
delete context[fn]
10511053
return result
10521054
}
10531055
```

JS/JS-en.md

+9-7
Original file line numberDiff line numberDiff line change
@@ -751,15 +751,16 @@ We can consider how to implement them from the following rules:
751751
```js
752752
Function.prototype.myCall = function (context) {
753753
var context = context || window
754+
var fn = Symbol('fn')
754755
// Add an property to the `context`
755756
// getValue.call(a, 'yck', '24') => a.fn = getValue
756-
context.fn = this
757+
context[fn] = this
757758
// take out the rest parameters of `context`
758759
var args = [...arguments].slice(1)
759760
// getValue.call(a, 'yck', '24') => a.fn('yck', '24')
760-
var result = context.fn(...args)
761+
var result = context[fn](...args)
761762
// delete fn
762-
delete context.fn
763+
delete context[fn]
763764
return result
764765
}
765766
```
@@ -769,18 +770,19 @@ The above is the main idea of simulating `call`, and the implementation of `ap
769770
```js
770771
Function.prototype.myApply = function (context) {
771772
var context = context || window
772-
context.fn = this
773+
var fn = Symbol('fn')
774+
context[fn] = this
773775

774776
var result
775777
// There's a need to determine whether to store the second parameter
776778
// If the second parameter exists, spread it
777779
if (arguments[1]) {
778-
result = context.fn(...arguments[1])
780+
result = context[fn](...arguments[1])
779781
} else {
780-
result = context.fn()
782+
result = context[fn]()
781783
}
782784

783-
delete context.fn
785+
delete context[fn]
784786
return result
785787
}
786788
```

0 commit comments

Comments
 (0)