【发布时间】:2017-05-22 09:26:39
【问题描述】:
我对 javascript 还很陌生,遇到了关于函数调用和闭包的问题。
以下是我在 w3schools 中尝试过的代码,
<!DOCTYPE html>
<html>
<body>
<p>Counting with a local variable.</p>
<button type="button" id="btn">Count!</button>
<p id="demo">0</p>
<script>
var add = (function (test) {
var counter = 0;
return function (test) {return counter += test;}
})();
/*function add(test){
var counter = 0;
return function (test) {return counter += test;}
}*/
function myFunction(){
document.getElementById("demo").innerHTML = add(123);
//document.getElementById("demo").innerHTML = add().call(this, 123);
}
var btn = document.getElementById("btn");
btn.addEventListener("click", myFunction);
</script>
</body>
</html>
对于当前的代码来说效果很好,每次我按下按钮时,段落中的数字(id="demo") 都会增加 123。
但是当我尝试注释代码时,它使用完全相同的代码创建一个带有闭包的函数,每次点击时段落值都保持在 123。
在这种情况下,我有几个问题要问。
1.代码:
var add = (function (test) {...}) ();
最后一个括号有什么用?如果我们在最后一个括号中提供参数,我们如何在变量(var add)的匿名函数的声明中使用它?
2.为什么这两种定义函数的方式会导致不同的结果?
非常感谢,感谢任何帮助。
编辑
<!DOCTYPE html>
<html>
<body>
<p>Counting with a local variable.</p>
<button type="button" id="btn">Count!</button>
<p id="demo">0</p>
<script>
/*var add = (function (test) {
var counter = 0;
return function (test) {return counter += test;}
})();*/
function add(test){
var counter = 0;
return function (test) {return counter += test;}
}
function myFunction(){
//document.getElementById("demo").innerHTML = add(123);
document.getElementById("demo").innerHTML = add().call(this, 123);
}
var btn = document.getElementById("btn");
btn.addEventListener("click", myFunction);
</script>
</body>
</html>
当我使用注释代码进行函数声明时,似乎代码运行没有错误,但只是段落整数没有增加的错误。
【问题讨论】:
-
()调用闭包。 -
该技术的术语是"immediately invoked function expression"。也称为 IIFE。
-
取消注释注释行时不会出错吗? Add() 将返回一个值,您不能在此调用
.call。
标签: javascript closures