【问题标题】:How to invoke function call if it is defined as var?如果将其定义为var,如何调用函数调用?
【发布时间】:2013-04-09 13:51:26
【问题描述】:

我正在使用 JQuery 和 JSON 从服务器获取数据。我定义了getBooksDoneFunc 作为变量,因为我不仅需要能够调用此函数一次(当getBooks 完成时)。不幸的是,我不能从signInOK 内部将getBooksDoneFunc 称为window["getBooksDoneFunc"]();。为什么?调用此函数的最佳方式是什么?

function getBooks(){     return $.getJSON( "bookstore.json" );             }

var getBooksDoneFunc = function(json) { 
         $.each(json.books, function(i, json){ .......... });

}

getBooks().done(getBooksDoneFunc);

function signInOK(){
         window["getBooksDoneFunc"]();
}

PS。 window["getBooksDoneFunc"](); 的想法取自 SO answer

更新:

var booksJSON = {};
window["getBooksDoneFunc"](booksJSON);

getBooksDoneFunc 必须使用参数调用,但对getBooksDoneFunc 的调用失败。 signInOK$(document).ready(function(){ }); 之外定义,但在其内部调用。

【问题讨论】:

  • 如果这一切都包含在另一个函数中,例如$(document).ready(function(){...});,那么getBooksDoneFunc 将不存在于window 下。
  • @ahren 听起来像是一个答案...
  • @kojiro - 很遗憾没有,因为我没有回答问题 “如果函数调用被定义为 var,如何调用?”“什么是调用此函数的最佳方式是什么?”
  • 您的 getBooksDoneFunc() 函数采用一个参数,但您尝试在没有任何内部 signInOK() 的情况下调用。
  • 失败信息是什么?如果调用成功但没有参数,则 json 未定义,您的 $.each 将抛出一个错误,因为 json.books 不存在,因为 json 未定义.

标签: javascript jquery


【解决方案1】:

试试:

function getBooks(){
  return $.getJSON( "bookstore.json" );
}

window.getBooksDoneFunc = function(json) { 
  $.each(json.books, function(i, json){ .......... });
}

getBooks().done(getBooksDoneFunc);

$(document)ready(function() {
  function signInOK(){
    var booksJSON = {};
    window.getBooksDoneFunc(booksJSON);
  }
});

【讨论】:

  • 你不需要.call(),只需调用函数。
  • 论据呢?如果超出范围(我对帖子的评论)怎么办?
【解决方案2】:

如果window["getBooksDoneFunc"](); 有效,那么getBooksDoneFunc() 有效,使用window 的想法是当您想要访问全局函数但您不知道存储在变量中的函数名称时。

在你的情况下,放一个硬编码字符串意味着更少,只是做getBooksDoneFunc()是一样的,因为你已经在变量中存储了函数self(不是函数名的字符串)。

不行的是,如果变量不是全局的,请检查作用域。

【讨论】:

    【解决方案3】:

    虽然我不太了解 signInOK() 函数,但我会做一些不同的事情。它将如何接收“json”数据。我将重构 getBooks 函数并重新考虑 signInOk 函数。这是一个开始:

    function getBooks() {
        $.getJSON("bookstore.json").done(function (json) {
            getBooksDoneFunc(json);
        });
    }
    
    var getBooksDoneFunc = function(json) { 
         $.each(json.books, function(i, json){ .......... });
    
    };
    
    ...
    
    getBooks();
    
    function signInOK(){
         getBooksDoneFunc("some json data");
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-27
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多