2015-10-20 4 views
2

У меня есть следующая логика:Ссылка функция внутри IIFE

var first_function = (function(d3, second_function) { 
    function third_function(param1, param2) { 
    /* do stuff here */ 
    } 
})(d3, second_function); 

Вне структуры IIFE, для доступа к третьей функции, я мог нормально сделать что-то вроде:

first_function.third_function(data1, data2); 

Где я Я ошибаюсь?

+2

Обратите внимание, что IIFE ничего не возвращает, и он выполняется немедленно, поэтому в основном 'first_function' является' undefined'? – adeneo

+1

Что вы возвращаете IIFE? Вам нужно вернуть объект, который имеет свойство third_function как свойство, иначе вы не сможете получить к нему доступ. –

+1

Кроме того, вы не можете получить доступ к 'third_function' вне IIFE, это то, что делает закрытие, внутренняя функция недоступна во внешней области, если вы не вернете что-то, чтобы сделать ее доступной. Реальный вопрос становится; почему вы используете IIFE? – adeneo

ответ

2

Его не возвращают, поэтому функция просто испаряется. Вы можете сделать что-то вроде этого:

var first_function = (function(d3, second_function) { 
    function third_function(param1, param2) { 
    /* do stuff here */ 
    } 
    return third_function; 
})(d3, second_function); 

Затем, вы можете получить доступ к нему, как это:

first_function(paramForThirdFunc1,paramForThirdFunc2); 
+0

Попытка этого. Отправляется как можно скорее. – daveycroqet

+0

@ daveycroqet Я сделал ошибку, проверьте это снова :) –

+0

Это сработало, спасибо. – daveycroqet

5

Если вы хотите получить доступ к свойству из IIFE, что вам нужно сделать это свойство доступно путем возврата объект

var first_function = (function(d3, second_function) { 

    // this function is unavailable to the outer scope 
    function third_function(param1, param2) { 
    /* do stuff here */ 
    } 

    // this object allows us to access part of the inner scope 
    // by passing us a reference 
    return { 
    third_function: third_function 
    } 
}})(d3, second_function); 

Интересно, что мы также можем воспользоваться этим, чтобы создать «частные» методы и переменные.

var first_function = (function(d3, second_function) { 

    // this function is unavailable to the outer scope 
    function third_function(param1, param2) { 
    /* do stuff here */ 
    } 

    var myPrivate = 0; // outer scope cannot access 

    // this object allows us to access part of the inner scope 
    // by passing us a reference 
    return { 
    third_function: third_function, 
    getter: function() { 
     return myPrivate; // now it can, through the getter 
    } 
    } 
}})(d3, second_function); 

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

+0

Да, это то, что он хочет. –

+0

Хотел бы я дать вам ответ на кредит. Харшал был просто быстрее, хотя это более полный ответ, и я благодарю вас за это. – daveycroqet

+2

они просто поддельные интернет-точки;) –

Смежные вопросы