在函数中调用窗口对象

时间:2015-08-10 08:01:42

标签: javascript window-object

我正在搜索一个窗口对象访问一个函数(实际上是一个ajax回调函数但是没关系)。所以,我发现了一个tuto,这个人解释了我的问题,为什么我有这个问题,但他没有解决它。

好吧,当我想访问window对象并创建一个警报时,该变量是未定义的。我理解为什么(我认为)。这是因为当全局变量在函数中时,此函数中的所有内容都受到保护。

这是他的代码:

(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无法解释它。有人能帮帮我吗?

(如果有人想要它,这里是tuto的链接: 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 个答案:

答案 0 :(得分:1)

嗯,您的案例中的问题是外部foo 不是 全局。一切都在函数内部,这意味着您的变量不会附加到window,而是附加到您的本地函数范围。

您无法访问外部foo的唯一问题是因为您使用内部foo对其进行了遮蔽。实用,理智和简单的解决方案是简单地避免遮蔽名称:

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

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

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

    bar();
}());

答案 1 :(得分:0)

您的Foo变量在上面的代码中不是全局范围,它在IIFE范围内。为了使其全球化(因此可以按照您在此处使用它的方式进行访问),您需要在IIFE之外声明它。或者,如果将IIFE的结果分配给全局范围内的变量,并从中返回一个对象,则可以将所返回对象中的方法作为您描述的回调引用。这通常用于命名空间JavaScript。您可以在标题为&#39;模块模式:私有数据和私有初始化&#39;的部分中找到类似方法的更多详细信息。在这里: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将在全局范围内。