范围 JavaScript

Scope JavaScript

我是 JavaScript 的新手。在下面的代码中,当我登录时,我尝试从数据库中获取用户信息并将其存储在 user 对象中。但是,当我检查 commandManager 范围内的用户时,它变为 null。我怎样才能让 user 而不是 null

代码如下:

function LogInCommand(username, password) {
  return new Command(function (user) {
    api
      .logIn(username, password)
      .then(function (data) {
        user = data;
        console.log(user);
      })
      .catch(function (error) {
        console.log(error);
      });
  });
}

function createCommandManager() {
  var user = null;

  return {
    execute: function (command, ...args) {
      command.execute(user, ...args);
    },
    user: user
  };
}

var commandManager = createCommandManager();

commandManager.execute(new LogInCommand("andy@gmail.com", "123456"));
setTimeout(function() {
  console.log(commandManager.user);
}, 10000);

结果如下:

{age: 21, connection: null, email: "andy@gmail.com", name: "andy", pendingConnection: null, …}
null

感谢大家的帮助!

因为您直接更改了 user 变量。它会破坏引用并且不会起作用。 如果你想用你的方式去做。您可以像下面这样更改您的代码。

function LogInCommand(username, password) {
  return new Command(function (initialData) {
    api
      .logIn(username, password)
      .then(function (data) {
        initialData.user = data;
        console.log(initialData.user);
      })
      .catch(function (error) {
        console.log(error);
      });
  });
}

function createCommandManager() {
  var initialData = {
     user: null,
  };

  return {
    execute: function (command, ...args) {
      command.execute(initialData, ...args);
    },
    data: initialData
  };
}

commandManager.execute(new LogInCommand("andy@gmail.com", "123456"));
setTimeout(function() {
  console.log(commandManager.data.user);
}, 10000);

代码中很明显的一点是没有以正确的方式关闭并且缺少命令。