Вызвать объект окна в функции

Я ищу доступ к объекту окна в функцию (на самом деле, функцию обратного вызова 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 будет в глобальной области видимости.

Другие вопросы по тегам