Javascript:var scopes

时间:2012-11-13 17:46:23

标签: javascript scope

我是JavaScript的初学者。
有人可以解释一下为什么这不起作用? 以及如何使其发挥作用?

function getResults(keywords) {

        foo.foo = function() {
               var bar = foo.getSomeText; // Contain "blabla"
        };

        return bar;

    }

    // Globale scope


    alert(bar); // Do nothing

编辑(抱歉缺少信息):

那是因为我想从xhr请求返回一些文本,我必须使用一个函数来使用onreadystatechange事件。 这是原始代码:

function getResults(keywords) {
     // Effectue une requête et récupère les résultats

    var xhr = new XMLHttpRequest();
    xhr.open('GET', './autoc.php?s='+ encodeURIComponent(keywords));

    xhr.onreadystatechange = function() {
        if (xhr.readyState == 4 && xhr.status == 200) {
           var response = xhr.responseText;
          var test = response.split('|');

        }



    };


    xhr.send(null);

    return test;

}



var hum = getResults('test');
console.log(hum);

4 个答案:

答案 0 :(得分:1)

foo.foo = function() {
    var bar = foo.getSomeText; // Contain "blabla"
};
return bar;

忽略foo似乎没有被声明的事实,bar在函数内声明,因此它只存在于那里,因为JavaScript具有函数作用域。您无法在该功能范围之外访问它,因此您不能{I}尝试在此处执行此操作。

如果在该函数之外声明它,则只能return

return bar

答案 1 :(得分:1)

javascript中变量的范围很简单。它是:

  • 声明它的功能
  • 全局范围(浏览器中为window)如果未在函数中声明

答案 2 :(得分:1)

这应该有效

var bar;
var foo = {getSomeText : 'blabla'};

function getResults(keywords) {

    foo.foo = (function() {
        return bar = foo.getSomeText; // Contain "blabla"
    })();

    return bar;

}

// Globale scope
bar = getResults('hi');

alert(bar); // Do nothing​​​​​​​​​​​​​​​​​​

<强> Fiddle

  • 由于语法错误,您的初始代码将无法正常工作,因为条形码不是 定义
  • foo是一个对象,甚至没有定义。所以你需要 创建对象。
  • getResults返回bar,可以在函数if中重新定义 您显式执行该函数,需要将其分配给 全局范围内的变量条。

<强>更新

AJAX是异步的,您尝试从函数返回值,该函数在回调函数中设置。 因为请求是异步的,所以函数在到达回调函数时已经返回。因此,在第二种情况下,测试将始终未定义

答案 3 :(得分:1)

任何变量的范围只取决于它的声明位置。 如果直接在脚本标记中声明它,而不是在脚本标记块中的方法中,它将是一个全局变量。

目前还不清楚你在代码示例中尝试做什么,因为在“foo.foo”中,第一个“foo”是一个未定义的实体。 你可以试试这个:

<script type="text/javascript">
var foo = {}// creating empty global object named 'foo'

foo.foo = function()//defining method foo() on object foo
{
    var bar = "some random text";

//// more coding here

return bar;

}

var myBar = foo.foo();// get text from method. Note that the method call should be post method definition
alert(myBar);
</script>

Javascript简单有趣。我建议阅读一些介绍性文本并查看代码示例以了解它。