javascript - ajax回调函数可以看到父函数的变量吗?

标签 javascript jquery ajax closures

function validateHistoryId(input) {
    $.getJSON('request.php', {"action": "historyExists", "history_id" : input.value},
              function(data) {
                  console.log(input.value);
              }
    );
}

我使用来自 javascript 函数的 jQuery ajax 调用。我尝试了上面的代码并且它可以工作,但我不知道它将来会不会导致任何问题。

我想知道,ajax 回调函数可以看到它的父函数的变量吗?这样做是不好的做法吗?

最佳答案

这是 JavaScript 的函数式处理方式。它称为闭包:函数携带来自其当前作用域和任何其他父作用域的变量指针。 因此,这不仅是一种很好的做法,而且是您通常应该遵循的模式,而不是四处乱转参数对象等。

请注意“this”引用是特殊的,它永远不会关闭(与任何其他引用相反),因此始终指向匿名函数中的全局对象。

事实上,开发人员需要一些时间才能充分利用闭包功能的强大功能 - 这是您刚刚编写的一个基本示例。在更高级(不仅仅是异步)的场景中,闭包可以帮助您创建“即发即弃”行为,或者可以为您提供无法从客户端代码访问的“私有(private)”变量(对库开发很有用)。闭包还可以帮助您隔离代码,使其不会干扰全局范围。

1) 示例:如何使用闭包创建 protected 变量。您可以访问两种可以访问“protectedVariable”的方法,但您自己无法访问它 - 因此可以保证控制。

function protectedScope(initData) {
  var protectedVariable = initData;

  return {
    getter: function()  { return protectedVariable; }
    setter: function(v) { protectedVariable = v; }
  }
}

var methods = protectedScope(10);

console.log(methods.getter());

2) 隔离:即使使用“全局”函数定义,以下代码也不会在全局范围内产生垃圾

var API = (function() {
   var protectedVariable = 0;

   var myNotGlobalFunction() {
      return protectedVariable;
   }

   return myNotGlobalFunction;
})();

关于javascript - ajax回调函数可以看到父函数的变量吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12968098/

相关文章:

javascript - vbox 中的 ExtJs DataView 高度

javascript - 理解 Javascript 中的正则表达式

javascript - 如何代理通过函数内部的 jQuery.find() 创建的每个元素的上下文?

c# - 提交 AJAX 请求时的 Controller 方法

javascript - ajax 单击禁用提交按钮并再次启用

javascript - 使用 javascript 添加带有文本组件的 li 元素

javascript - 如何将图像保存在特定文件夹 s3 下?

javascript - 在 JQuery 或 Javascript 中比较两个 JSON 数组

Javascript/jQuery If 条件

javascript - 无法更新 jQuery 中文本框的值