Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript ajax回调函数可以看到父函数中的变量吗?_Javascript_Jquery_Ajax_Closures - Fatal编程技术网

Javascript ajax回调函数可以看到父函数中的变量吗?

Javascript ajax回调函数可以看到父函数中的变量吗?,javascript,jquery,ajax,closures,Javascript,Jquery,Ajax,Closures,我使用来自javascript函数的jQueryAjax调用。我尝试了上面的代码,它的工作,但我不知道它会导致任何问题在未来 我想知道,ajax回调函数可以看到它的父函数的变量吗?这样做是一种不好的做法吗?这是JavaScript功能性的做事方式。它被称为闭包:函数从其当前作用域和任何其他父作用域携带变量指针。 因此,这不仅是一个好的实践,而且这是您通常应该遵循的模式,而不是推送参数对象等等 请注意,“this”引用是特殊的,它从不关闭(与任何其他引用相反),因此总是在匿名函数中指向全局对象 事

我使用来自javascript函数的jQueryAjax调用。我尝试了上面的代码,它的工作,但我不知道它会导致任何问题在未来


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

这是JavaScript功能性的做事方式。它被称为闭包:函数从其当前作用域和任何其他父作用域携带变量指针。 因此,这不仅是一个好的实践,而且这是您通常应该遵循的模式,而不是推送参数对象等等

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

事实上,开发人员需要一些时间来充分利用闭包特性的功能——这是您刚刚编写的一个基本示例。在更高级(而不仅仅是异步)的场景中,闭包可以帮助您创建“触发并忘记”行为,或者可以为您提供客户端代码无法访问的“私有”变量(对于库开发非常有用)。闭包还可以帮助您隔离代码,以便它不会干扰全局范围

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

function validateHistoryId(input) {
    $.getJSON('request.php', {"action": "historyExists", "history_id" : input.value},
              function(data) {
                  console.log(input.value);
              }
    );
}
2) 隔离:即使使用“全局”函数定义,以下代码也不会对全局作用域进行垃圾处理

function protectedScope(initData) {
  var protectedVariable = initData;

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

var methods = protectedScope(10);

console.log(methods.getter());

是的,它可以看到其父函数的变量,我不认为这算不上一个坏的做法,因为很多时候ajax调用的数据需要在其外部,我们可以使用其父函数的变量来实现同样的效果。没关系,应该不会有问题。这些是我想要听到的答案:)thx;)您可能想阅读以下内容:请注意,这是一个标准的JavaScript,无论是否使用jQuery库。哇,这是一个非常详细的解释。我确实从这篇文章中学到了很多东西。非常感谢!;)
var API = (function() {
   var protectedVariable = 0;

   var myNotGlobalFunction() {
      return protectedVariable;
   }

   return myNotGlobalFunction;
})();