Javascript - 更改 document.ready 中的全局变量?

Javascript - changing a global variable in document.ready?

我有一个全局变量 numberOfMessages,我想根据调用 solidity 合约返回的内容立即将其设置为特定数字。加载页面时,在 document.ready 函数中进行调用。但是,变量不会在此函数之外更改。

我的代码基本上是这样的:

var numberOfMessages = 0 // declared outside any function, so should be global
$(document).ready(function () {
Message.deployed().then(function (contractInstance) {
    contractInstance.getNumberMessages.call().then(function (v) {
      numberOfMessages = v
      alert(numberOfMessages) // returns something other than 0
    })
  })
})
alert(numberOfMessages) // returns 0

如何在加载页面时将全局变量设置为函数returns?

尝试移除

var numberOfMessages = 0

在第一行。如果你给一个没有声明的变量赋值,它会自动成为一个GLOBAL变量。

你的最后一行是 运行 在承诺的 .then() 异步回调之外。这意味着最后一行在文档就绪之前运行,甚至在异步调用完成之前触发 and

另外,不要使用 alert() 来测试您的代码,因为这样的提示通常是阻塞的,这意味着暂停代码执行并且可以使用异步回调做一些奇怪的事情。而是使用 console.log() 并在浏览器的 Javascript 控制台中查看结果(通常通过按 F12 打开)。

根据其他几个类似的问题,我可以说将您的变量声明为 window.numberOfMessages = 0

#3 window.a = 0;

This creates a property on the global object explicitly, using the window global that refers to the global object (on browsers; some non-browser environments have an equivalent global variable, such as global on NodeJS). As it's a normal property, you can delete it.

This property is enumerable, on IE8 and earlier, and on every other browser I've tried.

以上分类已由here 发布,为您解释什么是全局作用域变量和全局显式变量。

window.numberOfMessages = 0 // This creates a property on the global object explicitly
$(document).ready(function() {
  Message.deployed().then(function(contractInstance) {
    contractInstance.getNumberMessages.call().then(function(v) {
      window.numberOfMessages= v
      console.log(window.numberOfMessages) // returns something other than 0
    })
  })
})
console.log(window.numberOfMessages) // returns 0
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>