簡體   English   中英

如何在匿名 function 中引用和分配全局變量?

[英]How to refer and assign to a global variable inside an anonymous function?

我正在讀取 json 文件並將 json 分配給全局變量,但它似乎不起作用,因為全局變量仍未定義。

var libObj;

fs.readFile('library.json', 'utf8', function(err, data) {
    if (err){
        console.log(err);
    } else {
        libObj = JSON.parse(data);
    }
});

這是因為回調是非阻塞和異步的,並且在未來某個不確定的時間被調用,並且不會從上到下順序執行。

如果您添加額外的日志記錄,您可以看到會發生什么:

var libObj;

console.log("before");
fs.readFile('library.json', 'utf8', function(err, data) {
    console.log("callback called");
    if (err){
        console.log(err);
    } else {
        libObj = JSON.parse(data);
        console.log(libObj);
    }
});
console.log("after");

這將產生這個 output:

before
after
callback called
your data here

因此,您可以看到分配工作正常,它只是在您嘗試使用變量之后發生。


解決這個問題的常用方法是在回調中使用fs.readFile()的結果,或者從該回調中調用一些 function。

fs.readFile('library.json', 'utf8', function(err, data) {
    if (err){
        console.log(err);
    } else {
        console.log(data);
        // use data here
        // or call a function and pass it the data here
        someFunc(data);
    }
});
// don't try to use data here, it's not available yet

這是異步代碼執行的典型問題。 您的示例代碼不會從上到下執行。 特別是,您的匿名 function 不會被執行。 您需要了解全局上下文概念。 要解決您需要執行所有屬於 readFile function 的代碼的問題,它里面的所有回調都是這樣的:

fs.readFile('library.json', 'utf8', function(err, data) {
 if (err){
    console.log(err);
 } else {
    libObj = JSON.parse(data);
    executeMoreCode() //for exemple
 }
});

function executeMoreCode() {
  console.log('hello');
}

然后在 readFile function 上下文框之外創建一個 function 並在需要時調用它

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM