В чем разница между функцией 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
}