【发布时间】:2021-12-11 14:59:31
【问题描述】:
鉴于以下示例,为什么 outerScopeVar 在所有情况下都未定义?
var outerScopeVar;
var img = document.createElement('img');
img.onload = function() {
outerScopeVar = this.width;
};
img.src = 'lolcat.png';
alert(outerScopeVar);
var outerScopeVar;
setTimeout(function() {
outerScopeVar = 'Hello Asynchronous World!';
}, 0);
alert(outerScopeVar);
// Example using some jQuery
var outerScopeVar;
$.post('loldog', function(response) {
outerScopeVar = response;
});
alert(outerScopeVar);
// Node.js example
var outerScopeVar;
fs.readFile('./catdog.html', function(err, data) {
outerScopeVar = data;
});
console.log(outerScopeVar);
// with promises
var outerScopeVar;
myPromise.then(function (response) {
outerScopeVar = response;
});
console.log(outerScopeVar);
// geolocation API
var outerScopeVar;
navigator.geolocation.getCurrentPosition(function (pos) {
outerScopeVar = pos;
});
console.log(outerScopeVar);
为什么在所有这些示例中它都输出undefined?我不想要解决方法,我想知道为什么会发生这种情况。
注意:这是JavaScript 异步性 的典型问题。随意改进这个问题并添加更多社区可以识别的简化示例。
【问题讨论】:
-
@Dukeling 谢谢,我很确定我已经对该链接发表了评论,但显然有一些缺少的 cmets。另外,关于您的编辑:我相信在搜索此问题以将另一个问题标记为欺骗时,标题中包含“规范”和“异步”会有所帮助。当然,在寻找异步解释时,它也有助于从 Google 中找到这个问题。
-
再想一想,“canonical asynchricity topic”的标题有点重,“asynchronous code reference”更简单客观。我也相信大多数人会搜索“异步”而不是“异步”。
-
有些人在函数调用之前初始化他们的变量。如何更改以某种方式也代表这一点的标题?比如“为什么我的变量在函数内部修改后未改变?” ?
-
在您上面提到的所有代码示例中,“alert(outerScopeVar);”现在执行,而将值分配给“outerScopeVar”发生在以后(异步)。