所以我有以下JavaScript从Facebook提取用户数据:
正如您在该片段中看到的那样,我已经包含了一行' console.log(full_name);',它在成功运行时将用户全名输出到浏览器控制台。
然后当我尝试这个时:
<script>document.write('Hello, ' + full_name);</script>
它不起作用。它以Uncaught ReferenceError: full_name is not defined
返回。
我很困惑,因为它是明确定义的&amp;使用console.log
时有效。有人帮忙吗?
答案 0 :(得分:1)
<script>document.write('Hello, ' + full_name);</script>
您没有定义全局变量full_name。
答案 1 :(得分:0)
肯定会引发错误。
假设您包含该行
Animatable
直接在HTML中的,它将在fb API的调用 getLoginStatus 完成之前执行,这是您定义全局变量 full_name
的地方更不用说这是一种不好的做法(声明全局变量),但它是。
答案 2 :(得分:0)
在您的示例中,调用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。
答案 3 :(得分:0)
您似乎正在尝试在页面上呈现该名称。但是,正如@Andreas指出的那样,只要该块被命中,就会执行document.write,这是在返回Facebook API调用之前。相反,尝试在要呈现名称的元素上放置一个id,并在回调中使用getElementById。这样的事情。
FB.api('/me', function(response) {
document.getElementById('name').innerHTML = response.name;
});
此外,正如其他人所提到的那样,你通过在没有var关键字的情况下将它们放在你的回调中来污染你的全局范围。