JavaScript变量未定义,但事实并非如此

时间:2015-11-11 14:26:00

标签: javascript variables undefined

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

enter image description here

正如您在该片段中看到的那样,我已经包含了一行' console.log(full_name);',它在成功运行时将用户全名输出到浏览器控制台。

然后当我尝试这个时:

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

它不起作用。它以Uncaught ReferenceError: full_name is not defined返回。

我很困惑,因为它是明确定义的&amp;使用console.log时有效。有人帮忙吗?

4 个答案:

答案 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关键字的情况下将它们放在你的回调中来污染你的全局范围。