bind로 인한 혈액 사건
var a = 'win';
var obj = {
a: 'obj',
say: function() {
console.log(this.a);
}
};
obj.say(); // obj
var say = obj.say;
say(); // win
위의 예는 아무런 염려가 없다고 믿는다.자, 다음은 궁금증이 온다.
var a = 'win';
var obj = {
a: 'obj',
say: function() {
console.log(this.a);
}.bind(this) //
};
obj.say(); // ?
var say = obj.say;
say(); // ?
답이 도대체 무엇인지 잘 생각해 봐.................................................................................답은 다음과 같습니다.
> win
> win
이것은 우리bind의 이this가 사실상 전역 대상인 윈도우임을 나타낸다.이 이야기는 대상에 function 패키지가 있는this야말로 대상 자체를 가리키는 것이다...
너는 이렇게 하면 끝이라고 생각하니?Too simple!Naive!확대해서 불렀다.
var a = 'win';
var obj = {
a: 'obj',
say: function() {
console.log(this.a);
}.bind(obj) // this obj
};
obj.say(); // ?
var say = obj.say;
say(); // ?
답이 도대체 무엇인지 잘 생각해 봐.................................................................................답은 다음과 같습니다.
> win
> win
WTF?!뭐야?!이미 죽어라 bind 살았잖아??!!!왜 전역 변수를 출력합니까??!!!이것은 변수 향상 문제와 관련된다. 위의 코드는 우리가 해석한다.
var a, obj; // undefined
a = 'win';
obj = {
a: 'obj',
say: function() {
console.log(this.a);
}.bind(obj) // , bind undefined。 this
};
사실 나도 본래 이 원인이라고 생각하지 못했다.나중에 bind 함수를 간단하게 다시 써서 console를 통해 이유를 알게 되었다.
Function.prototype.bind = function(ctx) {
console.log(ctx); //
var self = this;
return function() {
self.apply(ctx, Array.prototype.slice.call(arguments));
};
};
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.