Вызвать объект окна в функции
Я ищу доступ к объекту окна в функцию (на самом деле, функцию обратного вызова ajax, но не имеет значения). Итак, я нашел туто, где парень объясняет мою проблему и почему у меня есть эта проблема, но он не решает ее.
Хорошо, когда я хочу получить доступ к объекту окна и создаю предупреждение, переменная не определена. И я понял почему (я думаю). Это потому, что когда глобальная переменная находится в функции, все в этой функции защищено.
Вот его код:
(function(){
var foo = "Hello, window";
var bar = function(){
var foo = "Hello, function";
alert(window.foo);
};
bar();
}());
Итак, моя проблема совершенно та же. У меня есть объект (с handsontable, но это не важно).
var hotTraitement = new Handsontable
Я определяю это в глобальном. Так что это может представлять foo = "Hello, window"
, И я пытаюсь использовать это в моей функции обратного вызова:
function callback(){
alert(window.hotTraitement);
}
И это не определено. Так что я не знаю, как сделать, чтобы мой объект был в моей функции, и Туто не объясняет это. Может кто-то помочь мне, пожалуйста?
(Если кому-то это нужно, вот ссылка на туто: https://www.youtube.com/watch?v=VSgSNQ1-KBo&spfreload=10)
РЕДАКТИРОВАТЬ:
Это весь мой код:
<script>
//Where I define my object "hotTraitement"
var container = document.getElementById('tab_traitement');
var hotTraitement = new Handsontable(container, {
data: data_traitement,
stretchH: 'all',
minSpareRows: 1,
observeChanges : true,
rowHeaders: false,
colHeaders: false,
contextMenu: true
});
</script>
//The function where I want to get that object
<script>
function insertTraitementCallback(responseObject,ioArgs)
{
alert(hotTraitement);
}
</script>
//My ajax request where I call my callback function
<script type="text/javascript">
$(document).ready(function()
{
$('#submit_button_traitement').click(function()
{
$.post("ajaxUpdate.php",{arr:data_traitement,id_essai,table,idTable}, insertTraitementCallback,'json');
});
});
</script>
2 ответа
Ну, проблема в вашем случае заключается в том, что внешний foo
не является глобальным. Все внутри функции, что означает, что ваши переменные не привязаны к window
, но в вашей локальной области функции.
Единственная проблема, почему вы не можете получить доступ к внешнему foo
потому что вы скрываете это внутренним foo
, Практичное, вменяемое и простое решение - просто избегать тени имени:
(function(){
var foo = "Hello, outer";
var bar = function(){
var foo2 = "Hello, function";
alert(foo); // Hello, outer
};
bar();
}());
Ваша переменная Foo не является глобальной областью действия в приведенном выше коде, она ограничена областью действия IIFE. Чтобы сделать его глобальным (и, следовательно, доступным так, как вы хотите использовать его здесь), вам нужно объявить его вне IIFE. В качестве альтернативы, если вы присваиваете результат вашего IIFE переменной в глобальной области и возвращаете объект из нее, вы сможете ссылаться на методы в этом возвращенном объекте в качестве обратного вызова, как вы описываете. Это обычно используется для пространства имен JavaScript. Вы можете найти более подробную информацию о подобном подходе в разделе "Шаблон модуля: личные данные и частная инициализация" здесь: http://www.2ality.com/2011/04/modules-and-namespaces-in-javascript.html. По сути, вы возвращаете объект, который определяет ваш метод внутри него, и возвращаете его из IIFE следующим образом:
var MyNamespace = (function() {
function myInternalMethod() {
//Do whatever your function does here...
}
return {
myPublicFunction() {
return myInternalFunction();
}
}
})();
И ваш обратный вызов может быть установлен на MyNamespace.myPublicFunction
потому что MyNamespace будет в глобальной области видимости.