В чем разница между функцией javascript как свойством window и функцией, определенной с именем [duplicate]

StackOverflow https://stackoverflow.com//questions/21013025

Вопрос

В чем разница между

function doStuff(){
    //do lots of fun stuff
}

и

window.doStuff = function(){
    //do lots of fun stuff
}

если таковые имеются?

Это было полезно?

Решение

Первый создаст свойство функции doStuff в любом текущем контексте области видимости.Если это окно (или область действия не определена), то результат будет таким же, как и во втором в контексте браузера.Однако, если текущая область видимости находится, например, внутри другой функции, то будет создана только локально доступная функция, и эффект не будет таким же, как внизу.

Другие советы

Нет большой разницы, если вы объявляете функцию в глобальной области видимости.Разница появляется, когда область кода, в которой вы объявляете функцию, не является глобальной.Например, внутри другой функции:

function doGlobalStuff()
{
    function doStuff(){
    // do lots of fun stuff
    }
}

Если вы выполните функцию doGlobalStuff(), объект window будет содержать метод doGlobalStuff(), но там нет метода doStuff().Однако эта функция создаст метод doStuff() в объекте window:

function doGlobalStuff()
{
    window.doStuff = function(){
    // do lots of fun stuff
    }
}

Найдите область действия переменной и функции для получения дополнительной информации, например, следующим образом:Какова область действия переменных в JavaScript?

Между этими двумя нет никакой разницы до тех пор, пока первый объявлен в глобальной области видимости.

Первый будет работать вне контекстов браузера, где window недоступен.У него также есть имя (независимо от того, какой переменной или ключу метода оно присвоено), которое полезно, помимо прочего, для трассировки стека и рекурсии.

Второй не будет работать, скажем, в node.js (хотя global бы).У него нет собственного имени, что затрудняет рекурсию, как в следующем примере:

window.doStuff = function( i ){
    if( --i ){
        return window.doStuff();
    }

    return i;
}

If window.doStuff присваивается что-то еще, следующим образом…

window.doStuff = 'erg';

...затем вышеупомянутая функция прерывается, потому что она анонимна и не может ссылаться сама на себя — она, по сути, потеряна.

Конечно, ничто не мешает вам делать и то, и другое:

window.doStuff = function doStuff(){
    //do lots of fun stuff
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top