bind로 인한 혈액 사건

3875 단어
먼저 두 가지 예를 살펴보겠습니다(브라우저 환경, 비엄격한 모드에서):
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));
    };
};

좋은 웹페이지 즐겨찾기