Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.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_Anonymous Function - Fatal编程技术网

Javascript匿名闭包

Javascript匿名闭包,javascript,anonymous-function,Javascript,Anonymous Function,我读过很多关于Javascript中闭包的书 那些牙套是干什么用的?? 我在上面读到,闭包应该定义为 (函数(){…})() 但是在上,它说闭包函数是 (函数(){…}()) 有什么区别?还是后一个有问题? 最后一个()的目的是什么?你能在里面放些参数吗? 我在找一个好的推荐人 编辑: 此外,还有一个例子 为什么此“函数”需要分号?如果需要在声明后立即调用它,则应将()放在结束分号之前。但是没有。语法 (function(){...})() 只是一个立即调用的匿名函数。如何使用括号并不重要,因

我读过很多关于Javascript中闭包的书 那些牙套是干什么用的?? 我在上面读到,闭包应该定义为

(函数(){…})()

但是在上,它说闭包函数是

(函数(){…}())

有什么区别?还是后一个有问题? 最后一个()的目的是什么?你能在里面放些参数吗? 我在找一个好的推荐人

编辑: 此外,还有一个例子

为什么此“函数”需要分号?如果需要在声明后立即调用它,则应将()放在结束分号之前。但是没有。语法

(function(){...})()
只是一个立即调用的匿名函数。如何使用括号并不重要,因为底层代码是一个正在声明和调用的函数

闭包被用来描述一种情况,函数可以访问在其作用域之外声明的变量,这些变量可以通过闭包访问

为清楚起见:

如果我们有以下功能

   function hello() {
      alert("Hello");
   }
我们可以使用以下命令调用函数

hello()
它调用函数“hello”。但如果我们不想给它起个名字,但仍然调用它,那么我们可以这样做

(function hello() {
   alert("Hello");
})()
这与前面调用
hello

但是,在这种情况下,将函数命名为“hello”没有意义,因此我们可以简单地将其删除:

(function() {
    alert("Hello");
})()

这是你原来问题中使用的符号。

没有区别。您也可以这样做:

true && function(){ /* code */ }();
0,function(){ /* code */ }();

!function(){ /* code */ }(); // Facebook style
~function(){ /* code */ }();
-function(){ /* code */ }();
+function(){ /* code */ }();

// with new    
new function(){ /* code */ }
new function(){ /* code */ }() // if you need arguments then use brackets
你的例子展示了一个,或者说生活。它对口译员说:

  • 这里有一个函数
  • 它没有名字
  • 使其远离全局范围,即“窗口”
  • 现在就说吧
是的,您可以将参数放入最后一个()中。例如:

(
    function(username){
        alert("Hello " + username);
    }
)("John Smith")

是JavaScript的一个特性,它允许我们实现类似于C++或java语言中的私有变量。

function getBmiCalculator(height, weight) {
    // These are private vars
    var height = height;
    var weight = weight;

    function calculateBmi(){
        return weight / (height * height);
    }
    return calculateBmi;
}

var calc = getBmiCalculator(1.85, 90);

// calc still has access to the scope where height and weight live.
var bmi = calc();
alert(bmi);

在本例中,在销毁calc之前,不能对身高和体重进行垃圾收集。存在高度和重量的内存或“范围”部分是“闭合的”

分组运算符可以将函数描述包围起来,就像没有调用括号一样,也包括调用括号一样。即,以下两个表达式均正确:

      (function () {})();
      (function () {}());

它不是闭包,而是一个匿名函数。它的可能副本的精确副本调用该函数。如果没有它,您只会创建一个永远不会运行的函数(并且无法运行,因为您无法以任何方式引用它)。没有人回答本页上的主要问题<代码>(函数(){…}())
(函数(){…})()是相同的。前者是Douglas Crockford的首选方法,但后者同样有效。我相信是的,我是说调用函数表达式的两种方法是相同的。闭包不同于立即调用的函数表达式。如果我误解了这个问题,请告诉我:)关于调用括号有什么好的文档吗?@user1978421我为您添加了一个渐进的例子,为什么?这一切都是正确的,但我怀疑JavaScript初学者是否会理解为什么这样做。因为在某些情况下可以保存1个字符:)这不是我的意思。例如,为什么
(function(){/*code*/}())
+函数(){/*code*/}()工作时
函数(){/*code*/}()
*函数(){/*代码*/}()不要?允许函数调用的这些行的特征是什么?
      (function () {})();
      (function () {}());