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。
所以我有以下 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。