2015-08-10 2 views
0

Я ищу доступ к объекту окна в функцию (фактически, функцию обратного вызова ajax, но никогда не думает). Итак, я нашел туто, где парень объяснил мою проблему и почему у меня есть эта проблема, но он не разрешает ее.Вызов объекта окна в функции

Ну, когда я хочу получить доступ к объекту окна, и я создаю предупреждение, переменная не определена. И я понял, почему (я думаю). Это связано с тем, что, когда глобальная переменная находится в функции, все в этой функции защищено.

Вот его код:

(function(){ 
    var foo = "Hello, window"; 

    var bar = function(){ 
     var foo = "Hello, function"; 

     alert(window.foo); 
    }; 

    bar(); 
}()); 

Итак, моя проблема совсем то же самое. У меня есть объект (с мобильным, но это не важно).

var hotTraitement = new Handsontable 

Я определяю его в глобальном масштабе. Таким образом, он может представлять foo = "Hello, window". И я пытаюсь использовать его в моей функции обратного вызова:

function callback(){ 
    alert(window.hotTraitement); 
} 

И это не определено. Поэтому я не знаю, как это сделать, чтобы получить объект в моей функции, и балет не объясняет это. Может кто-то мне помочь, пожалуйста ?

(Если кто-то хочет, вот ссылка на Tuto: https://www.youtube.com/watch?v=VSgSNQ1-KBo&spfreload=10)

EDIT:

Это весь мой код:

<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> 
+1

ни одна из ваших переменных foo не является глобальной. – webduvet

ответ

1

Ну, проблема в вашем случае является то, что внешний foo составляет не глобальный. Все внутри функции, что означает, что ваши переменные не привязаны к window, но к вашей локальной области возможностей.

Единственная проблема, почему вы не можете получить доступ к внешнему foo, заключается в том, что вы затеняете его внутренним foo. Практическим, здравомыслящий и простое решение, чтобы просто избежать затенения имя:

(function(){ 
    var foo = "Hello, outer"; 

    var bar = function(){ 
     var foo2 = "Hello, function"; 

     alert(foo); // Hello, outer 
    }; 

    bar(); 
}()); 
+0

Спасибо, но в моем случае мой объект вышел из функции, и в любом случае он не определен. – Erlaunis

+0

Что означает «из функции»? Где именно это определяется? – deceze

+0

Из моей функции обратного вызова. Например: 'var hotTraitement = new Handsontable ... function callback() {// Здесь вызывается hotTraitement}' – Erlaunis

0

Ваша переменная 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 бы в глобальном масштабе.

+0

Так что я должен был объявить свой объект в 'myInternalMethod'? И мне нужно вернуть этот объект с помощью 'myPublicFunction' для доступа к нему после? – Erlaunis

+0

Значение, возвращаемое из IIFE, которое мы присваиваем здесь переменной MyNamespace, будет доступно за пределами IIFE с помощью MyNamespace. [Whatever]. В этом случае myInternalMethod - это функция, которую вы пытаетесь использовать в качестве обратного вызова для вашего вызова AJAX, а MyNamespace.myPublicFunction - это то, что вы передадите этой функции AJAX, чтобы она была недоступна вне области IIFE. –

+0

Итак, я что-то пробовал, но, честно говоря, я ничего не понимаю:/Поэтому я попытался: var myFunction = (function() {var hotTraitement = new ... function callback() {}}()); ' – Erlaunis

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