【发布时间】:2013-10-01 17:10:29
【问题描述】:
我试图让一些 jQuery 函数更容易实现,因此我尝试将一些自动完成逻辑封装到一个函数中,以允许用户发送 URL 的变量、Web 服务的参数和控制我们需要取谁的值。使用以下脚本,我得到错误:response is not defined。这个想法是,在这个 Web 服务中将有许多不同的方法具有自动完成功能,我可以简单地将适当方法的名称及其参数传递给 Complete 方法,并在多个文本框上拥有该功能。
为什么会这样
$(document).ready(function ()
{
$('#auto').autocomplete(
{
source: function (request, response)
{
Complete('GetNames', 'hospitalName', '#auto');
}
});
function Complete(url, varName, target)
{
$.ajax(
{
type: "POST",
url: "Service.asmx/" + url,
data: "{'" + varName + "':'" + $(target).val() + "'}",
dataType: "json",
contentType: "application/json",
success: function (data)
{
//uncaught reference error response is not defined
response(data.d);
},
error: function (xhr)
{
console.log(xhr.status);
}
});
}
});
在我尝试取出 AJAX 调用并使其成为自己的方法之前,这一切正常。我想知道
- 源函数正在调用 Complete 函数,而源函数有
request和response作为参数,那么为什么它们在我的脚本中未定义? - 如何解决此问题并避免在 #1 中出现问题。
【问题讨论】:
-
参数的作用域就是那个函数体。由于
Complete不在source:函数的主体内,所以response超出范围。 -
那么在源代码范围内调用 Complete 没关系?嗯..更多的阅读要做。感谢您的洞察力。
-
你需要了解lexical作用域和dynamic作用域的区别。 JS 使用词法作用域,这意味着作用域是指函数的文本体。
-
@Barmar 是的。现在我知道名字是什么,我知道要找什么了。 :)
标签: javascript jquery ajax scope