js中的变量

时间:2013-01-29 12:19:42

标签: javascript kendo-ui

关于js,我是一个非常棒的人,今天我遇到了一些我并不理解的js,我想。你可以请一些亮点吗?有剑道参与,但问题是简单的js。

我有一个嵌套网格,例如。每行可以扩展到其他网格,每个网格都有自己的数据源。当用户点击时,我通过下面的方法逐个填充数据源,当从create调用接收到异步响应时,我遇到了强制数据源读取的问题。 (调用read是非常不正确的事情,但是Kendo有自己的错误 - 这里不是重点。)。我的问题是,我没有一个实例来调用read(),该方法只返回数据源并将其分配给一个网格,当事件返回时我找不到任何引用我可以得到正确的来自的数据源实例。这是不同的背景。

为了解决这个问题,我在构建数据源的方法中添加了一个数据源变量,然后返回变量而不是数据源,这是同样的事情。然而,这有助于调用有问题的read()。现在在我的创建处理程序中,我在innit期间在方法中返回的变量上调用create。它确实有效,但我不确定每个数据源是否在自己的实例后调用了自己的实例?

function _getDatasource() {
        var datasource = new kendo.data.DataSource({
            transport: {
                read: {
                    url: serviceBaseUrl + "ReadQuestionnaire",
                    dataType: "json",
                    type: "POST",
                    contentType: "application/json; charset=utf-8",

                },               
               create: {
                    url: serviceBaseUrl + "CreateQuestionnaire",
                    dataType: "json",
                    type: "POST",
                    contentType: "application/json; charset=utf-8",
                    complete: function (jqXhr, textStatus) {
                        if (CheckForExceptions(jqXhr, textStatus) == false) {
                            // this is the variable I am not sure about 
                            // after innit does this always refers to this same datasource ?
                            datasource.read(); 
                        }
                    }
                }
            }
        });
        return datasource;
}

1 个答案:

答案 0 :(得分:3)

您的解决方案是正确的,是的,datasource.read()调用在每种情况下都是正确的数据源对象。

这就是为什么这样做的原因:闭包。

闭包是能够在嵌套函数中访问的一个函数中声明变量的能力。或者,有关更准确的说明,请参阅维基百科页面:http://en.wikipedia.org/wiki/Closure_(computer_science)

这是一个非常简单的例子:


function doStuff(){
  var name = "Derick";

  function sayMyName(){
    console.log(name);
  }

  sayMyName();
}

doStuff();

在这个例子中,我在name函数内声明变量doStuff。然后我在第一个函数中嵌套了另一个函数。 sayMyName函数通过使用闭包访问name变量。

当我调用doStuff()时,变量被定义并分配给一个值。然后定义sayMyName函数并使用该变量。然后我调用sayMyName()并将名称记录到控制台。

同样,在您的代码中,您正在创建一个分配给DataSource实例的变量。稍后,您将为complete回调定义一个函数。加载数据源并触发complete回调后,您将访问通过在该变量周围使用闭包而分配给DataSource实例的相同dataSource变量。

由于每次调用var dataSource时都声明_getDataSource,因此您正在创建一个新的变量/引用,并将其分配给新的DataSource实例。我觉得你不需要在函数的底部return datasource,但至少不是complete回调函数才能工作。但是,除了这个功能之外,你可能还需要它吗?

有关JavaScript中闭包的更多信息:

https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Closures

How do JavaScript closures work?

http://www.javascriptkit.com/javatutors/closures.shtml

http://www.watchmecode.net/javascript-scope(付费截屏)

HTH