Cara penulisan pertama
里面的if分支只会执行一次,返回的函数里面已经不包含浏览器判断了,所以相对于常规写法,已经很棒了
var addEvent = (function(){
if(window.addEventListener){
return function(elem, type, handler){
elem.addEventListener(type, handler, false);
};
}else if(window.attachEvent){
return function(elem, type, handler){
elem.attachEvent('on' + type, handler)
};
}
})();
Cara penulisan kedua
在第一次进入if判断后,重写了addEvent函数,这样后续的addEvent也不包含分支判断语句了,感觉跟第一种写法并没有多大的区别,但是第二种写法被称为惰性载入函数,可是我并没有感觉他比第一种方式惰在哪里啊?相较来说,我更喜欢第一种方式,求解释
var addEvent = function(elem, type, handler){
if(window.addEventListener){
addEvent = function(elem, type, handler){
elem.addEventListener(type, handler, false);
};
}else if(window.attachEvent){
addEvent = function(elem, type, handler){
elem.attachEvent('on' + type, handler);
};
}
addEvent(elem, type, handler);
};
Itu sangat jelas, terima kasih!
Samhanx
Beri perhatian kepada IIFE dengan cara pertama menulis, supaya apabila kod dilaksanakan dan fungsi addEvent ditetapkan, ia akan menjadi jelas sama ada addEvent ialah fungsi yang dikembalikan oleh if atau else if.
Dalam cara penulisan kedua, addEvent masih merupakan fungsi paling luar semasa melaksanakan kod Apabila anda benar-benar memanggil addEvent(), anda menetapkan semula nilai secara dalaman untuk menjelaskan apa itu addEvent, dan kemudian memanggil dirinya dalam fungsi pembohongan.
Perhatikan bahawa terdapat proses lulus untuk parameter perantaraan, dan jika ia tidak dipanggil, rujukan kepada fungsi luar akan sentiasa disimpan pada addEvent Selepas fungsi pelaksanaan segera kaedah penulisan pertama dilaksanakan, memori yang diduduki oleh. fungsi tanpa nama akan Mula menunggu untuk kitar semula.
Saya faham bahawa kaedah kedua dipanggil fungsi pemuatan malas, yang relatif kepada kaedah pertama:
1) Kaedah pertama, kerana ia adalah IIFE, tidak kira sama ada
addEvent
dipanggil atau tidak Telah disahkan bahawa penyemak imbas menyokongaddEventListener
atauattachEvent
addEvent
, 都已经确认了浏览器支持的是addEventListener
,还是attachEvent
;2) 第二种方法,则是在显式调用
addEvent
2) Kaedah kedua ialah apabila secara eksplisit memanggiladdEvent
Untuk mengetahui status sokongan penyemak imbas; .Dalam kaedah kedua, addEvent telah ditetapkan semula selepas panggilan pertama, dan tidak perlu melakukan pertimbangan cawangan pada panggilan kedua