2015-01-23 1 views
0

В приведенном ниже кодеJavascript - Как вызвать метод внутри функции self invoking?

(function x() { 
var j = function() { alert("234234"); } 
return { 
    s: j 
} 
})() 

var x1 = new x(); 
x1.s(); 

Как вызвать метод J()? Или перед этим я должен спрашивать, есть ли способ создать экземпляр функции x(), потому что это то, что происходит. Пожалуйста, обратитесь к скрипку http://jsfiddle.net/e5k6bdvn/

+0

Для чего у вас это такое? Этот шаблон не имеет смысла. – epascarello

+1

Вы очень странный код. Кажется, что вы построили что-то, следуя шаблону модуля (за исключением того, что вы использовали именованную функцию), а затем вы вызываете функцию, которая должна быть только вызывается автоматически * снова *, но, как если бы это была функция-конструктор (которая определенно не является предназначенный быть) – Quentin

+0

Правда! вы поймали это. вся идея заключается не в том, чтобы сделать его конструкторной функцией. но я пытаюсь найти способ вызвать метод j внутри него. Кстати, самоназывающие функции не могут быть конструкторской функцией? –

ответ

7
  1. Не дают функцию самостоятельно, ссылающегося имя (есть мало пользы для него за что делает его легче найти в StackTrace, который вы не должны в этой точке, и утечки памяти в пожилом IE)
  2. не вызывайте функцию самостоятельно вызывающую дважды
  3. не лечить функцию самостоятельно вызывающую, как если бы это была функция конструктора (вызывая его new)
  4. ли захватить возвращение значение функции самозапуска

Такой:

var x = (function() { 
 
     var j = function() { alert("234234"); }; 
 
     return { 
 
      s: j 
 
     }; 
 
    })(); 
 
    
 
    x.s();


Или, если вы хотите создать несколько объектов таким же образом:

  1. Не использовать самостоятельно вызова функции
  2. Вызывайте x столько раз, сколько вы l икэ

Такой:

function x() { 
 
     var j = function() { alert("234234"); }; 
 
     return { 
 
      s: j 
 
     }; 
 
    }; 
 

 
    var x1 = x(); 
 
    var x2 = x(); 
 
    x1.s();


Или, если вы хотите создать функцию-конструктор:

  1. Не возвращайте ничего от него
  2. ли использовать цепи прототипов

Такой:

function x() { 
 
    }; 
 

 
    x.prototype.s = function() { 
 
     alert("234234"); 
 
    } 
 
    
 
    var x1 = new x(); 
 
    var x2 = new x(); 
 
    x1.s();

+0

Спасибо, 1 вопрос. В моем коде я получаю сообщение об ошибке при выполнении var x1 = new x(). Что-то не так с тем, как я создаю экземпляр, или просто невозможно рассматривать функцию self invoking как функцию-конструктор? –

+0

В вашем исходном коде есть одна переменная 'x', поскольку она ограничена именованным выражением функции' x' и недоступна вне нее. Вы не храните функцию, которую вы пытаетесь вызвать в любом месте, поэтому вы не можете получить к ней доступ. Даже если вы его сохранили - он имеет явный оператор return и не использует 'this', поэтому нет смысла пытаться использовать его как функцию конструктора. – Quentin

0

Как заявил @epascarello, это трудно сказать, что контекст вашего вопроса.

Если значение x предназначено для возврата объектов более одного раза, вы не должны его немедленно вызывать. Вместо этого вам нужно только объявить:

function x() { return { j: function() { alert("234234") } } } 

затем вызвать его всякий раз, когда вы хотите, и вызывать j.

var x1 = x(); 
x1.j(); 

Если вместо этого вы планируете использовать x только один раз, это хорошо, чтобы вызвать его немедленно, но вы должны потреблять вызов j сразу тоже.

(function() { 
    return { 
     j: function() { 
      alert("234234") 
     } 
    } 
})().j();