0

我是 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

4 回答 4

1

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

  • 声明它的函数
  • 全局范围(window在浏览器中),如果它没有在函数中声明
于 2012-11-13T17:50:35.370 回答
1
foo.foo = function() {
    var bar = foo.getSomeText; // Contain "blabla"
};
return bar;

foo忽略似乎没有被声明的事实,bar是在函数内部声明的,因此它只存在于那里,因为 JavaScript 具有函数范围。您无法在该功能范围之外访问它,因此您无法return在此处尝试访问它。

return bar当它在该函数之外声明时才可以:

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

};
return bar;
于 2012-11-13T17:48:49.377 回答
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​​​​​​​​​​​​​​​​​​

小提琴

  • 由于未定义 bar 语法错误,您的初始代码将无法工作。
  • foo 在这里是一个对象,甚至没有定义。所以你需要创建对象。
  • getResults如果您显式执行函数并需要将其分配给全局范围内的变量 bar,则返回可以在函数内部重新定义的 bar。

更新

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

于 2012-11-13T17:51:24.353 回答
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 既简单又有趣。我建议阅读一些介绍性文本并查看代码示例以理解它。

于 2012-11-13T17:54:33.987 回答