Вы должны понимать разницу между ссылками на функции и вызовом функции.
Рассмотрим следующую функцию
function foo()
{
alert( 'Hello World' );
}
Теперь давайте рассмотрим некоторые примеры ссылок на эту функцию. Для ссылки на функцию мы используем имя символа, как и любую другую переменную.
// Alert contents of foo
alert( foo );
// Set foo as the click handler for the body
document.body.onclick = foo;
// Assign a new function to foo
foo = function(){ alert( 'Goodbye!' ); }
Теперь мы рассмотрим вызов функции. Это означает, что функция выполняется, и ее возвращаемое значение отправляется обратно в область вызова.
// Invoke foo simply
foo();
// Invoke foo with a specific scope
foo.apply( this ); // or foo.call( this );
Теперь можно полностью изменить фрагмент кода, просто изменив код sdefaults()
. Вот как это будет выглядеть.
function sdefaults()
{
return function()
{
alert("test");
}
}
Теперь, когда вы выполняете sbtn.onClick = sdefaults();
, происходит то, что свойство onClick
получает ожидаемую функцию, поскольку мы изменили sdefaults, чтобы фактически не предупреждать "test", а чтобы возвращать анонимную функцию, которая сама будет оповещение "тест". (Как примечание, этот специфический метод обычно называется лямбда-функцией или делегатом)
Надеюсь, это прояснит.