Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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闭包与类实例_Javascript_Oop_Closures - Fatal编程技术网

javascript闭包与类实例

javascript闭包与类实例,javascript,oop,closures,Javascript,Oop,Closures,这个问题更多的是关于理论编程而不是实践 我一直在读javascript中的闭包。简单地说,它们是一个函数,具有一组只能由函数访问的变量,而不能由函数的副本访问。每个函数都有自己的变量a 但是,我认为它的工作方式与同一类的实例完全相同,每个类都有自己的成员/属性。实例的方法只能访问该实例中的var a 闭包是否完成了OOP无法完成的事情?或者,至少,当使用闭包时,代码更干净,或者有另一个优势 很抱歉这么说,但我看到人们谈论闭包,好像它是javascript必须提供的最伟大的东西之一。。。但我认为这

这个问题更多的是关于理论编程而不是实践

我一直在读javascript中的闭包。简单地说,它们是一个函数,具有一组只能由函数访问的变量,而不能由函数的副本访问。每个函数都有自己的变量a

但是,我认为它的工作方式与同一类的实例完全相同,每个类都有自己的成员/属性。实例的方法只能访问该实例中的var a

闭包是否完成了OOP无法完成的事情?或者,至少,当使用闭包时,代码更干净,或者有另一个优势

很抱歉这么说,但我看到人们谈论闭包,好像它是javascript必须提供的最伟大的东西之一。。。但我认为这只是创建一个作用域不会消失的函数的副作用。我错了吗

编辑

由于一些人认为这个问题只有基于观点的答案,我将对这个问题进行改写,使讨论变得具体:


闭包能做什么?只有OOP javascript提供的闭包是做不到的?

当我需要某个东西的多个实例时,我使用类或可实例化的对象,通常在只有一个实例时使用函数闭包,只是为了让许多内部变量保持私有


闭包不仅仅是类的一种替代方法,但是,在js中经常使用外部作用域中的“关闭”变量。

经过大量研究,我发现(或者可能我在过去无法理解这一点,即使我已经读过)闭包的优点

当在javascript中使用OOP时,无法生成私有变量(作为一个孤独的程序员,永远不需要它们)。对象的成员总是可访问的,也就是说,总是在作用域上

但是闭包使变量只能在定义的范围内对代码进行访问。在作用域之外使用变量名称的任何尝试都将到达在该作用域上具有相同名称的其他变量(如果已定义)。除非所述范围向范围外提供get/set方法,否则无法进入这些变量的范围以获取/设置它们。这些方法可以访问变量,并且可以从“外部世界”调用。一种创建私有变量的方法,一种getter/setter方法

另一个优点是,在闭包的作用域内时,不要与前面提到的具有相同名称的外部变量混淆


这就是所谓的“封装”,可以通过闭包而不是普通的javascript OOP来实现。

javascript实际上没有类(在ES5中),它有原型和作用域,并在特定的作用域中封装某些内容,然后在较低的作用域中定义的函数中使用它,创建一个闭包,其中父范围中声明的变量仍然可用,等等。我正在学习JS,我真的和你一样对对象和闭包感到困惑+很好的解释。