【问题标题】:How to pass variable to callback function in javascript如何在javascript中将变量传递给回调函数
【发布时间】:2014-01-29 12:36:31
【问题描述】:

我有以下一段代码,我不太清楚如何将它一直传递给 onload 函数。

我试图在不同的地方定义它但没有成功,特别是因为它的定义需要在传递给document.on 方法的函数中进行,因为我想获得this 引用。

$(document).ready(function(e) {
    $(document).on('click', "#someId", function(e) {
        e.preventDefault();
        var variable = $(this).attr('name');

        chrome.fileSystem.chooseEntry({
            type: 'openFile', accepts:[{
                extensions: ['txt']
            }] 
        }, 
        function(fileEntry) {
            if (!fileEntry) {
                return;
            }
            fileEntry.file(function(file) {
                var reader = new FileReader();
                reader.onload = function(e) {
                    ////******* how to access variable here? *******\\\\
                    chrome.storage.local.set({'txt': e.target.result});
                };
                reader.readAsArrayBuffer(file);
            });
        });
    });
});

我需要在onload 函数中访问variable。 如何通过?

【问题讨论】:

  • 你不需要通过它。它位于外部作用域中,因此在作用域链中自然可用。
  • @Beetroot-Beetroot,我在 onload 函数内部设置断点并查看变量范围,但我看不到变量。此外,当我尝试在控制台中获取值时,我得到 ReferenceError: variable is not defined
  • 在这种情况下,要么我误解了这个问题,要么你运行的代码与上面显示的不同。
  • 只是一个想法 - 尝试将 var 命名为 variable 以外的其他名称。 Javascript 有一大堆保留字,它们实际上并没有出现在语言本身中。 variable 可能是其中之一。
  • @Beetroot-Beetroot 我已经编辑了代码,所有内容都包含在$(document).ready(function(e) 中,但不要认为这会产生任何影响。尝试将变量名称更改为 variable 以外的其他名称,没有任何变化。

标签: javascript closures scope


【解决方案1】:

您可以利用 closures 这样做:

onload = function () {
    var variable;
    $(document).on('click', "#someId", function(e) {
        variable = $(this).attr('name');
        // use variable here
    });
    // and here
};

【讨论】:

    【解决方案2】:

    如果我正确解析了你的代码,那么你应该能够在你想要的地方使用变量。它在正确的范围内,并且有一个闭包可以使其保持活动状态。

    使其全局化,就像之前的答案一样,会产生同时调用的问题 - 变量值可能会被下一次调用覆盖,并且在 .onload 中获取它时会得到不同的值。

    【讨论】:

    • 当然,它不能保证这些问题,它只是允许它们。
    • 我刚刚在 onclick 处理程序中使用全局变量时遇到了令人讨厌的错误。从那以后我就再也没有这样做了,只是为了防止将来出现此类错误
    • 我在onload 函数内部设置断点并查看变量范围,但我看不到variable 那里。此外,当我尝试在控制台中获取值时,我得到 ReferenceError: variable is not defined
    猜你喜欢
    • 2017-10-03
    • 2016-08-21
    • 2015-05-02
    • 1970-01-01
    • 2015-06-08
    • 2017-11-30
    • 2015-07-10
    • 1970-01-01
    相关资源
    最近更新 更多