Безопасно ли копировать ссылку на собственный метод JavaScript? - PullRequest
0 голосов
/ 03 февраля 2011

Например,

var w = document.getElementById;
var b = w('header');
var c = w('footer');
var d = w('body');

Редактировать: Точка с запятой - еще один из этих больших аргументов.Я думал, что отредактирую вопрос для развлечения.

Редактировать: Ответы на комментарии Andrey найдены на его ответ.

«Как копирование ссылок делает его более эффективным с JS-компиляторами?»
Ответ: JS-компиляторы предназначены для сокращения и / или запутывания кода.Если бы было 40 вызовов document.getElementById(..), было бы гораздо компактнее, если бы они вызывали getById(..), который был бы переименован во что-то вроде O(..).

"Также, когда вы обрабатываете элемент htmlсобытия, вы обычно указываете метод js, и внутри метода вы помещаете логику, а не непосредственно в обработчики событий html - это не требуется, но рекомендуется »
Ответ: Iзнать.Но у нас много веб-систем, и они редко полностью следуют хорошей практике.

"Кроме того, использование встроенных методов напрямую делает код более читабельным" Ответ: Учитывая эти два примера, я думаю, что последний является более читабельным

document.getElementById('total').value = document.getElementById('subtotal').value + document.getElementById('salestax').value - document.getElementById('discount').value
document.getElementById('yousaved').value = document.getElementById('discount').value / (document.getElementById('subtotal').value + document.getElementById('salestax').value)

или

var byId = document.getElementById
byId('total').value = byId('subtotal').value + byId('salestax').value - byId('discount').value
byId('yousaved').value = byId('discount').value / (byId('subtotal').value + byId('salestax').value)

Ответы [ 3 ]

3 голосов
/ 03 февраля 2011

Вы имели в виду

var w = document.getElementById

?

Эта ссылка подробно объясняет, почему вы не должны этого делать: Похоже, псевдоним функции JavaScript не работает

0 голосов
/ 08 февраля 2011

На самом деле оказывается, что преимущество компилятора бесполезно, если вы используете gzip. gzip уже имеет встроенную дедупликацию при поиске любой строки. Таким образом, если бы каждый экземпляр документа имел точку после него, он также дедуплицировал бы точку.

Фактически, если у вас есть переменная со строкой, компилятор Google Closure по умолчанию заменит все ссылки на переменную самой строкой, удалит переменную и предположит, что она принесла прибыль. с помощью gzip.

См .: https://groups.google.com/group/closure-compiler-discuss/browse_thread/thread/857bdaa095a8685e

0 голосов
/ 03 февраля 2011

Ну, бывает, что он даже не работает в Chrome.Я полагаю, я мог бы проверить это, прежде чем размещать здесь.Я получаю TypeError: Illegal invocation.

Альтернатива вместо

var byId = document.getElementById

просто использовать

function byId(a) {return document.getElementById(a)}

Это не так эффективно, но оно короче и многоу компиляторов не возникнет никаких проблем при конвертации

function getElementById(id) {return document.getElementById(id)}

в

function q(a){return document.getElementById(a)}

Редактировать: Спасибо Андрею: теперь я знаю, что причина первого примера неработа была из-за того, что я менял document.getElementById на window.getElementById.

Следующее работает в моем тесте и, исходя из того, что я читаю, должно работать везде.

var d = document
d.i = d.getElementById
...