JavaScript 变量未定义,但它不是

JavaScript Variable Undefined, but it is not

所以我有以下 JavaScript 从 Facebook 提取用户数据:

正如您在该片段中所见,我包含了行 'console.log(full_name);',当 运行 成功将用户全名输出到浏览器控制台时。

然后当我尝试这个时:

<script>document.write('Hello, ' + full_name);</script>

没用。它返回 Uncaught ReferenceError: full_name is not defined

我很困惑,因为它定义明确并且在使用 console.log 时有效。有人帮忙吗?

肯定会报错

假设您包括行

<script>document.write('Hello, ' + full_name);</script>

直接在HTML中,它会在fb API的调用getLoginStatus完成之前执行,这是您定义全局的地方变量 full_name

更不用说这是一种不好的做法(声明全局变量),但确实如此。

在您的示例中,调用 console.log(full_name) 有效,因为它是在该代码中定义的。在您指定的内联脚本中引用 full_name 将不起作用,因为它无法访问您传递给 getLoginStatus 的回调范围;更具体地说,在您的示例中,它将在全局对象上查找 full_name,在浏览器的情况下为 window。因此,window.full_name 是正确的 undefined。在任何情况下,也不能保证您的回调会在您调用 document.write.

时被调用

要解决此问题,您需要在回调中调用 document.write 或将值存储在别处以供以后检索。顺便说一句,你应该 avoid document.write.

Smashing Magazine 在 JavaScript 范围内有一个 article

您似乎正试图在页面上呈现名称。但是,正如@Andreas 指出的那样,document.write 会在该块被命中时立即执行,这是在您的 Facebook API 调用返回之前。相反,请尝试在您希望在其中呈现名称的元素上放置一个 id,并在回调中使用 getElementById。像这样。

FB.api('/me', function(response) {
  document.getElementById('name').innerHTML = response.name;
});

此外,正如其他人所提到的,您将许多变量放在您的回调中而不使用 var 关键字,这会污染您的全局范围。

<script>document.write('Hello, ' + full_name);</script>

你没有定义全局变量full_name。