처음에는으로 해결책을 arguments.callee
찾았지만 끔찍했습니다.
전역 엄격 모드에서 중단 될 것으로 예상했지만 거기에서도 작동하는 것 같습니다.
class Smth extends Function {
constructor (x) {
super('return arguments.callee.x');
this.x = x;
}
}
(new Smth(90))()
를 사용 arguments.callee
하고 코드를 문자열로 전달하고 엄격하지 않은 모드에서 강제로 실행 하기 때문에 나쁜 방법이었습니다 . 그러나 무시하는 생각보다 apply
나타났습니다.
var global = (1,eval)("this");
class Smth extends Function {
constructor(x) {
super('return arguments.callee.apply(this, arguments)');
this.x = x;
}
apply(me, [y]) {
me = me !== global && me || this;
return me.x + y;
}
}
그리고 테스트는 다른 방법으로 이것을 함수로 실행할 수 있음을 보여줍니다.
var f = new Smth(100);
[
f instanceof Smth,
f(1),
f.call(f, 2),
f.apply(f, [3]),
f.call(null, 4),
f.apply(null, [5]),
Function.prototype.apply.call(f, f, [6]),
Function.prototype.apply.call(f, null, [7]),
f.bind(f)(8),
f.bind(null)(9),
(new Smth(200)).call(new Smth(300), 1),
(new Smth(200)).apply(new Smth(300), [2]),
isNaN(f.apply(window, [1])) === isNaN(f.call(window, 1)),
isNaN(f.apply(window, [1])) === isNaN(Function.prototype.apply.call(f, window, [1])),
] == "true,101,102,103,104,105,106,107,108,109,301,302,true,true"
버전
super('return arguments.callee.apply(arguments.callee, arguments)');
실제로 다음과 같은 bind
기능이 있습니다.
(new Smth(200)).call(new Smth(300), 1) === 201
버전
super('return arguments.callee.apply(this===(1,eval)("this") ? null : this, arguments)');
...
me = me || this;
수 call
와 apply
의 window
일관성 :
isNaN(f.apply(window, [1])) === isNaN(f.call(window, 1)),
isNaN(f.apply(window, [1])) === isNaN(Function.prototype.apply.call(f, window, [1])),
따라서 수표는 다음으로 이동해야합니다 apply
.
super('return arguments.callee.apply(this, arguments)');
...
me = me !== global && me || this;