add 是个变量还是个方法?

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>菜鸟教程(runoob.com)</title>
</head>
<body>

<p>局部变量计数。</p>
<button type="button" onclick="myFunction()">计数!</button>
<p id="demo">0</p>
<script>
var add = (function () {
    var counter = 0;
    return function () {return counter += 1;}
})();
function myFunction(){
    document.getElementById("demo").innerHTML = add();
}
</script>

</body>
</html>

为什么 var add = (function()....)() 怎么写?
调用时,为什么是 add() ?
求指教

阅读 3k
4 个回答

函数名本身就是一个变量,所以你其实应该看看的是自执行函数。

外层函数自执行,然后这个函数返回了另外一个函数, 再把这个返回的函数赋值给变量add。

这就好比:

    var add = function() {};
    add();

这样的代码是不是很好理解? 这就是个函数表达式而已。

在Javascript中,函数是第一公民;函数也是一个对象,可以当作函数参数或者作为返回值,在这里就使用了当作返回值的特性;

当在一个函数中声明另一个函数,内部函数可以访问外部函数声明的变量,构成作用域链

将一个函数作为另一个函数返回值时,构成闭包

这里使用了立即执行函数,这个立即函数中声明的变量也就成为了私有变量,只能通过闭包才能访问,这就做了一个安全变量。

因为立即执行函数返回的是另一函数,所以要用add()才可以运行函数;
里面涉及的知识点还是比较多的,可以看一下其他资料理解一下。

这典型的闭包的用法,变量counter在立即执行的匿名函数中可见,外部访问不到,并且返回一个函数来处理这个局部变量。至于你的疑问是写法:

这里相当于:

function inner(){
    var counter = 0;
    return function () {return counter += 1;}
}

var add = inner(); // ==> function () {return counter += 1;}
add() // 执行return的函数

一个变量 接受匿名函数返回的值
不过你调用错了
add后面不应该加()

clipboard.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题