【问题标题】:Call a window object in a function在函数中调用窗口对象
【发布时间】:2015-11-02 01:34:53
【问题描述】:

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

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

这是他的代码:

(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)

编辑:

这是我的全部代码:

<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 变量都不是全局变量

标签: javascript window-object


【解决方案1】:

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

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

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

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

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

    bar();
}());

【讨论】:

  • 谢谢,但在我的情况下,我的对象不在功能范围内,而且它仍然是未定义的。
  • “功能外”是什么意思?它究竟是在哪里定义的?
  • 超出我的回调函数。喜欢:var hotTraitement = new Handsontable ... function callback(){ //Get the hotTraitement here}
  • 只要该回调函数定义在与变量相同的词法范围中,您就可以从回调函数内部访问它。再一次,看看我上面的例子。从bar 内部,您可以完全访问foo,而无需执行任何其他操作。
  • 你必须展示你的实际代码“不起作用”。我可以向您解释为什么您的示例不起作用,我做到了。我无法告诉您为什么您的实际代码不起作用,因为您没有显示它。
【解决方案2】:

您的 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 将在全局范围内。

【讨论】:

  • 所以我必须在myInternalMethod 中声明我的对象?我需要用myPublicFunction 返回那个对象才能在之后访问它?
  • 我们在此处分配给 MyNamespace 变量的从 IIFE 返回的值将可以通过使用 MyNamespace.[whatever] 在 IIFE 外部访问。在这种情况下,myInternalMethod 是您尝试用作回调 AJAX 调用的函数,而 MyNamespace.myPublicFunction 是您要传递给该 AJAX 函数的函数,以便它在 IIFE 范围之外可用。
  • 所以,我尝试了一些东西,但老实说,我不明白每一件事:/ 所以我尝试了:var myFunction = (function(){ var hotTraitement = new ... function callback(){} }());
  • 但是当我调用我的 ajax 回调时,我尝试了myFunction.callback,但它不起作用(myFunction 未定义),但我不确定:/跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-09
  • 2012-09-11
  • 2013-11-25
  • 2021-10-24
相关资源
最近更新 更多