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

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

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

а также

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

если есть?

4 ответа

Решение

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

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

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

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

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;
}

Если window.doStuff назначается что-то еще, как показано ниже:

window.doStuff = 'erg';

… Затем вышеприведенная функция прерывается, потому что она анонимна и не может ссылаться на себя - она ​​по существу потеряна.

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

window.doStuff = function doStuff(){
    //do lots of fun stuff
}
Другие вопросы по тегам