2014-02-10 2 views
1

У меня есть объект, и мне нужно его для запуска содержимого страницы. Мне нужно обернуть его строгим режимом. Я попытался вернуть его для использования в глобальном масштабе, но это не решило мою проблему.Объект в строгом режиме

(function($) { 
    "use strict"; 

    var MyObj = { 
     // some code here. 
    } 

    return MyObj; 

})(jQuery); 

console.log(MyObj); // <= undefined 

Как получить доступ к этому объекту из любого места моего проекта?

+2

Ваш IIFE возвращает его в никуда. Поместите 'var foo =' перед определением и исполнением функции и используйте ее. – zerkms

+0

Спасибо zerkms, это сработало. – tolga

ответ

4

У вас есть immediately-invoked function expression (IIFE), который специально разработан, чтобы держать вещи в стороне от внешнего пространства. Так как вы возвращения MyObj, все, что вам нужно сделать, чтобы сделать его доступным в глобальном масштабе это:

var MyObj = (function($) { 
    "use strict"; 

    var MyObj = { 
     // some code here. 
    } 

    return MyObj; 

})(jQuery); 

console.log(MyObj); 

Другой способ сделать это было бы поставить MyObj в глобальном пространстве явно. В браузере глобальный объект называется window, так что вы можете, внутри вашего IIFE, сказать window.MyObj = { /* some code here */ }. Однако я бы отговорил этот подход, потому что внешнему наблюдателю не ясно, что это происходит (т. Е. Вам придется полагаться на документацию). Лучший подход - вернуть объекты, которые вы хотите открыть, и вызывающий может выбрать размещение в глобальном пространстве.

+0

Большое спасибо, это сработало. – tolga

1

Используя use strict, вы можете просто помещать объект в int глобальное пространство имен явно. Например, вы можете использовать window.myObj = MyObj в своей функции.

Другим возможным способом достижения вашей цели является передача глобального объекта в вашу функцию (это может быть окно в браузере или глобальное в nodejs).

(function($, global) { 
    "use strict"; 
    var MyObj = {} 
    global.myObj = MyObj; 
})(jQuery, window); 

Кроме того, как предложил Этан, так как вы вернетесь MyObj, вы можете просто присвоить результат вызова к переменной.

var myObj = (function($) { 
    "use strict"; 
    var MyObj = {} 
    return x 
})(jQuery); 
myObj; //now defined in the global scope 
+0

Еще один хороший ответ. Благодарю. – tolga

+0

Мне нравится ваш второй пример лучше (передача глобального контекста), но я все еще чувствую, что это «черный ящик», изменяющий глобальный контекст. Лучше, ИМО, чтобы IIFEs возвращали свои значения (которые не ограничиваются одним значением, поскольку вы можете вернуть объект). Это возлагает ответственность за глобальное присвоение на вызывающего абонента, где оно принадлежит. –

+0

Я абсолютно с тобой согласен, Этан. Я думаю, что ваш ответ самый лучший, и он описывает подход, который я обычно имею в своем коде. Я просто добавил несколько разных подходов к полноте, но, пожалуйста, знайте, что я проголосовал за ваш ответ ;-) –

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