var obj = {
    say: function() {
        function _say() {
            console.log(this);
        }
        return _say.bind(obj);
    }()
};

obj.say();

Hasil kode keluar dari global atau jendela, saya ingin tahu mengapa metode bind tidak mengikat 'ini' ke konteks objek obj?

3
smallbone 11 Agustus 2017, 06:10

2 jawaban

Jawaban Terbaik

Selama penugasan, variabel obj masih tidak memiliki nilai apa pun. Dengan demikian, panggilan Anda untuk mengikat setara dengan .bind(undefined) yang berperilaku seperti yang Anda amati.

Untuk lebih spesifik, this mengacu pada window karena OrdinaryCallBindThis lakukan langkah-langkah berikut (mode tidak ketat):

[...]
If thisArgument is undefined or null, then
[...]
Let thisValue be globalEnvRec.[[GlobalThisValue]].

Anda dapat memeriksa di chrome debugger bahwa [[BoundThis]] memang undefined setelah panggilan Anda.

1
ASDFGerte 11 Agustus 2017, 05:08

Anda segera menjalankan fungsi tersebut. Hapus tanda kurung setelah fungsi say. Jika Anda mengharapkan untuk memanggil fungsi tanpa dua tanda kurung berurutan obj.say()() gunakan .call() alih-alih .bind()

var obj = {
  say: function() {
    function _say() {
      console.log(this);
    }
    return _say.call(this);
  }
};

obj.say();
0
guest271314 11 Agustus 2017, 03:15