2013-07-04 3 views
5

Есть ли реальные преимущества при использовании window.onload = function() {}; overload = function() {}; ? Я знаю, что window.onload выглядит более корректно, но это не повод для меня выбрать, особенно, что он длиннее/медленнее, чем onload.onload = function vs window.onload = function

После нескольких длительных поисков и испытаний, те 2 были только 2 браузерных методы, тесты (на относительно новых версий Chrome/Firefox и IE от 5,5 до 9) включен:

window.onload // works in all tested browsers 
onload // works in all tested browsers, faster than window.onload 
document.onreadystatechange // works twice in some browsers, once in some others, could be confusing 
window.onpageshow // works in chrome and firefox, not in IE 
window.onreadystatechange // doesn't work 
document.onload // doesn't work 
document.onpageshow // doesn't work 
window.document.onload // doesn't work 

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

http://perfectionkills.com/onloadfunction-considered-harmful/

Он утверждает, что строгий режим ECMA-262 5th edition («использовать строгий»,, который я не планирую использовать в своем проекте), может в конечном итоге вызвать некоторую несовместимость браузера с загрузкой (ReferenceError в Firefox и Opera).

Таким образом, возникает вопрос: существуют ли какие-либо реальные недостатки, связанные с использованием прямого назначения onload, отличного от «use strict»; один? Мне нужна информация, а не какие-то необъяснимые мнения.

Благодаря

Примечание: я поиск, прежде чем задавать этот вопрос (который выглядит немного классический, я знаю), самые близкие вопросы, которые я мог бы найти было около window.onload против < тела OnLoad = «» >, другие альтернативы window.onload и т.д.

Edit: Я создал этот тестовый случай onload vs window.onload, что доказывает, насколько быстрее это OnLoad. Я бы действительно пошел на такую ​​микро-оптимизацию, потому что почему бы и нет? Иногда они могут быть прохладными.

+0

onload и window.onload являются синонимом моих знаний – mplungjan

+0

«onload ... ** быстрее **, чем window.onload» - как вы тестируете это? Я боюсь думать, что вы можете даже измерить разницу в производительности между ними. Разумеется, нет разницы в производительности, что было бы фактором в реальном коде. – MrWhite

+0

Ну, я имею в виду ** назначение на загрузку ** быстрее, я иногда пробовал его на jsperf в разных браузерах, результаты вообще не обсуждались. вот новый тестовый пример http://jsperf.com/onload-vs-window-onload Я знаю, что он по-прежнему считается микро-оптимизацией, но это также то, что вы можете узнать один раз и всегда применять – heytools

ответ

3

Оба одинаковы ... Когда вы вызываете onload самостоятельно, javascript предполагает, что это глобальное свойство, которое является свойством объекта window. Так что, в основном, если вы конкретно не говорите, что это window.onload, то механизм javascript сделает это за вас.

if (onload === window.onload) { 
    alert("it's the same"); //true 
} 

До тех пор, пока вы не заботитесь о строгом режиме, у вас не должно быть проблем с современными браузерами. Однако считается, что лучше использовать полную версию window.onload, а не только загрузку. Вы не набираете много, не набрав лишних 7 символов.

+0

Да, мне нужно объяснение этому «однако». И предложение из 7 символов не требуется, я уже сказал, что onload быстрее не просто короче. Что касается вашего ответа, см. Мой первый комментарий под ответом Kaizo. – heytools

+1

Считается лучшей практикой (использовать 'window.onload'), поскольку она позволяет избежать двусмысленности, ее легче читать и, таким образом, делает ваш код более переносимым и менее подверженным ошибкам. Вы, вероятно, не стесняетесь использовать 'window.top', но тот же принцип применяется. – MrWhite

1

Все глобальные функции и переменные находятся внутри объекта окна. Поэтому, когда вы используете onload, вы используете window.onload.

При вызове чего-то внутри пространства имен у вас есть стоимость исполнения: он должен получить окно объекта, а затем свойство onload.

При вызове глобальной переменной без окна у вас есть риск, что она переопределяется внутри своей сферы:

function() { 
    var onLoad = function() {alert("foo")}; 
    function() { 
    onLoad(); 
    } 
} 

В этом примере оповещения OnLoad «Foo»;

Так вы спросили are there any real disadvantages related to using the direct onload assignment:

OnLoad может быть переопределена и код может не работать.

+0

if (XMLHttpRequest) не работает в некоторых старых браузерах IE, а если (window.XMLHttpRequest), так что принятия общего правила недостаточно, я считаю. – heytools

+0

@ Kaizo: В приведенном выше коде 'onLoad' должен быть всем строчным, чтобы скрыть глобальное свойство' onload' - при условии, что это то, что вы демонстрируете. – MrWhite

+0

@heytools: Что вы подразумеваете под «общим правилом»? Ваш пример, похоже, указывает на причудливость браузера, а не на код Kaizo. Код Kaizo пытается показать, что 'onload' в локальной области необязательно ссылается на глобальное свойство onload (т.е.' window.onload') - это неоднозначно. В то время как 'window.onload' делает. Локальная переменная 'onload' _hides_ - глобальное свойство' onload' в цепочке областей видимости. – MrWhite

Смежные вопросы