Преимущество использования префикса «окна» в JavaScript - PullRequest
8 голосов
/ 17 июля 2009

Есть ли какие-либо преимущества использования префикса 'window' при вызове переменных или методов javascript в объекте window? Например, будет ли у вызова window.alert преимущество перед простым вызовом alert? Я могу представить, что использование префикса может дать небольшое повышение производительности, когда вызов выполняется из какой-то функции / объекта, однако я редко вижу это в коде людей. Отныне этот вопрос.

Ответы [ 7 ]

9 голосов
/ 17 июля 2009

Это полезно при попытке проверить значения глобального объекта. Например, если GlobalObject не определено, выдается ошибка:

if(GlobalObject) { // <- error on this line if not defined
    var obj = new GlobalObject();
}

но это не выдает ошибку:

if(window.GlobalObject) { // Yay! No error!
    var obj = new GlobalObject();
}

Аналогично с:

if(globalValue == 'something') // <- error on this line if not defined
if(window.globalValue == 'something') // Hurrah!

и

if(globalObj instanceof SomeObject) // <- error on this line if not defined
if(window.globalObj instanceof SomeObject) // Yippee! window.prop FTW!

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

7 голосов
/ 17 июля 2009

Я сомневаюсь, что есть какой-то ощутимый выигрыш в производительности. После того, как вся цепочка областей будет сначала сканироваться на предмет идентификатора window, тогда объект окна будет сканироваться на предмет требуемого элемента. Следовательно, более вероятно, что это будет иметь решающее значение для производительности.

Использование префикса окна полезно, если у вас есть другая переменная в области видимости, которая скрывает элемент, который вы можете извлечь из окна. Вопрос в том, можете ли вы всегда знать, когда это может быть? Ответ - нет. Так что вы всегда должны префикс с окном? Как бы вы написали код, если бы сделали это. Некрасиво. Поэтому не делайте этого, если не знаете, что вам нужно.

4 голосов
/ 17 июля 2009

Получено от Google (http://www.techotopia.com/index.php/JavaScript_Window_Object):

Объект окна является объектом верхнего уровня иерархии объектов. Таким образом, всякий раз, когда на метод или свойство объекта ссылаются в сценарии без имени объекта и префикса точки, JavaScript считается членом объекта окна. Это означает, например, что при вызове метода window alert () для отображения диалогового окна оповещения открывается окно. префикс не обязателен. Поэтому следующие вызовы методов достигают одного и того же:

window.alert ()
предупреждение ()

Однако я прочитал, но у меня не было времени проверить следующее: (http://www.javascriptref.com/reference/object.cfm?key=20)

Однако вам нужно быть осторожным в обработчиках событий. Поскольку обработчики событий привязаны к документу, свойство Document с тем же именем, что и свойство Window (например, open), будет маскировать свойство Window. По этой причине вы всегда должны использовать полное «окно». синтаксис при обращении к свойствам окна в обработчиках событий.

1 голос
/ 18 июля 2009

Что касается производительности, я думаю, что AnthonyWJones это покрыл.

Одно из применений префикса окна - явно сделать что-то доступным за пределами текущей области видимости. Если вы писали код в самовозглашающейся функции, чтобы избежать загрязнения глобальной области, но в ней было что-то, что вы хотели сделать глобально доступным, вы можете сделать что-то вроде следующего:

(function(){
    function foo(){
        //not globally available
    }
    function bar(){
        //not globally available        
    }
    window.baz = function(){
        //is globally available
        foo();
        bar();
    };
})();
0 голосов
/ 17 июля 2009

Когда вы используете префикс, вы делаете это явно, вы используете «глобальное» определение переменной, а не локальное. (Я не уверен, можете ли вы / как внедрить переменные в область действия в JS, за исключением странностей с этим и встроенными обработчиками событий.) YMMV, вы можете либо предпочесть ясность, либо найти ее просто беспорядком.

0 голосов
/ 17 июля 2009

Это имеет значение только в том случае, если вы используете фреймы и выполняете несколько вызовов javascript для разных фреймов, и даже тогда только конкретные сценарии гарантируют необходимость явной ссылки на window.

0 голосов
/ 17 июля 2009

Я полагаю, что выигрыш в производительности в лучшем случае удивительно незначителен, если он вообще есть.

...