Зачем нужна двойная скобка у function expression? Подскажите, почему такой код выполнить alert (Jsfiddle):var newclass = new Classname(); newclass.method.init(); function Classname () { this.method = function () { return { init: function () { alert(); } } }() } А этот код не выполнить alert (Jsfiddle):var newclass = new Classname(); newclass.method.init(); function Classname () { this.method = function () { return { init: function () { alert(); } } } }
Когда вы используете двойные скобки вокруг анонимной функции возвращающей объект, это означает, что вы сразу вызываете эту функцию и результат этого вызова будет присвоен переменной this.method. В примере с двойными скобками код сработает, потому что функция сразу вызывается и объект с методом init будет возвращен.
В примере без двойных скобок, функция не вызывается сразу, а только присваивается свойству method. Поэтому когда вы пытаетесь вызвать newclass.method.init(), method на самом деле является функцией, а не объектом с методом init, поэтому будет ошибка.
Если вы хотите, чтобы код без двойных скобок работал так же как и с двойными скобками, вы можете вызвать this.method() сразу после определения как функции:
function Classname () { this.method = function () { return { init: function () { alert(); } } }(); }
Когда вы используете двойные скобки вокруг анонимной функции возвращающей объект, это означает, что вы сразу вызываете эту функцию и результат этого вызова будет присвоен переменной this.method. В примере с двойными скобками код сработает, потому что функция сразу вызывается и объект с методом init будет возвращен.
В примере без двойных скобок, функция не вызывается сразу, а только присваивается свойству method. Поэтому когда вы пытаетесь вызвать newclass.method.init(), method на самом деле является функцией, а не объектом с методом init, поэтому будет ошибка.
Если вы хотите, чтобы код без двойных скобок работал так же как и с двойными скобками, вы можете вызвать this.method() сразу после определения как функции:
function Classname () {this.method = function () {
return {
init: function () {
alert();
}
}
}();
}
Таким образом, код должен выполнить alert.