在函数中调用窗口对象

Call a window object in a function

本文关键字:窗口 对象 调用 函数      更新时间:2023-09-26

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

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

下面是他的代码:
(function(){
    var foo = "Hello, window";
    var bar = function(){
         var foo = "Hello, function";
         alert(window.foo);
    };
    bar();
}());

所以,我的问题是相同的。我有一件物品(带手提袋的,但不重要)。

var hotTraitement = new Handsontable

我在global中定义它。所以它可以表示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>

那么,在您的情况下的问题是,外部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将在全局作用域中