Saya pikir ini mungkin duplikat dari Pelanggaran Ketat menggunakan kata kunci ini dan pola modul terbuka
Saya memiliki kode ini:
function gotoPage(s){
if(s<=this.d&&s>0){this.g=s; this.page((s-1)*this.p.size);}
}
function pageChange(event, sorter) {
var dd = event.currentTarget;
gotoPage.call(sorter, dd[dd.selectedIndex].value);
}
Dan JSHINT (JSLINT) mengeluh. Tercantum "Pelanggaran ketat". untuk garis yang disorot:
Apakah penggunaan saya atas Function.call()
dan kemudian mereferensikan instance, entah bagaimana tidak pantas?
Apakah ini dianggap gaya yang buruk?
javascript
jslint
strict
jshint
Cheeso
sumber
sumber
this
. Saya tidak tahu mengapa JSLint akan menyebutnya Pelanggaran Ketat, tetapi saya tahu bahwa jika Anda tidak menentukanthis
nilai suatu fungsi, itu akan beradaundefined
dalam mode ketat. Jelas Anda sedang mendefinisikanthis
, jadi itu seharusnya tidak menjadi masalah."-W040":true
di config json, tetapi karena json tidak memiliki komentar, Anda tidak dapat memberi tahu siapa pun mengapa itu ada.Jawaban:
JSHint mengatakan "Kemungkinan pelanggaran ketat" karena Anda menggunakan
this
sesuatu di dalam yang, sejauh yang diketahui, bukanlah sebuah metode.Dalam mode non-ketat, panggilan
gotoPage(5)
akan mengikatthis
objek global (window
di browser). Dalam mode ketat,this
akanundefined
, dan Anda akan mendapat masalah.Agaknya, Anda bermaksud memanggil fungsi ini dengan
this
konteks terikat , misalnyagotoPage.bind(myObj)(5)
ataugotoPage.call(myObj, 5)
. Jika demikian, Anda dapat mengabaikan JSHint, karena Anda tidak akan menghasilkan kesalahan apa pun. Tetapi, ia memberi tahu Anda bahwa kode Anda tidak jelas bagi siapa pun yang membacanya, karena menggunakanthis
di dalam sesuatu yang jelas bukan merupakan metode cukup membingungkan. Akan lebih baik untuk meneruskan objek sebagai parameter:sumber
this
akhirnya menjadiundefined
, maka masalah sebenarnya bukan hanya pelanggaran mode ketat . Mereka akan lebih baik memberikan peringatan yang mengatakan bahwathis
mungkinundefined
ketika dalam "mode ketat", mengarah keTypeError
(atau sesuatu).event.currentTarget
sebagai gantinyathis
..jshintrc
untuk menonaktifkan pemeriksaan ini?/* jshint validthis: true */
jika Anda hanya memiliki pasangan dan tidak ingin berubah untuk setiap kasus.Saya menerima pesan ini untuk fungsi yang tidak dimulai dengan huruf kapital.
sumber
Something
adalah konstruktor karena kapital S, dan karenanya harus dipanggil menggunakannew
. Melakukannya berartithis
menjadi objek baru berdasarkan pada `Something.prototype '. Kemungkinan besar karena asumsi itu tidak memunculkan peringatan kemungkinan pelanggaran ketat.Jika Anda mendeklarasikan fungsi sebagai variabel daripada menggunakan deklarasi fungsi standar, jshint tidak akan menandai ini sebagai pelanggaran ketat. Jadi, Anda dapat melakukan hal berikut -
sumber
Jika Anda mencoba mengimplementasikan suatu metode, Anda mungkin ingin menetapkan ke prototipe sebagai gantinya:
JSHint tidak akan memperingatkan ketika fungsi sedang ditetapkan.
sumber
ClassName.prototype.myMethod = myMethod;
, lalu tentukan metode di bawah. Anda masih mendapatkan kesalahan meskipun myMethod terikat dengan benar.