JavaScript 理解示例中的闭包
closures in javascript understanding example
本文关键字:闭包 JavaScript 更新时间:2023-09-26
function setupSomeGlobals() {
// Local variable that ends up within closure
var num = 666;
// Store some references to functions as global variables
gAlertNumber = function() {console.log(1); alert(num); }
gIncreaseNumber = function() { num++; }
gSetNumber = function(x) { num = x; }
}
我怎样才能访问这里的gAlertNumber方法?
更新:此代码是关于 JavaScript 闭包如何工作的答案中的示例 4
假设你在Web浏览器中,你必须先执行setupSomeGlobal()
。然后你的非声明处理程序变量g...将在全局对象window
下创建,您将能够从页面中的任何位置执行gAlertNumber()
。
您可以在身体的onload
中执行setupSomeGlobal()
:
<html>
<head>
<script>
function setupSomeGlobals() {
// Local variable that ends up within closure
var num = 666;
// Store some references to functions as global variables
gAlertNumber = function() {console.log(1); alert(num); }
gIncreaseNumber = function() { num++; }
gSetNumber = function(x) { num = x; }
}
</script>
</head>
<body onload="setupSomeGlobals();">
<input type="button" value="Show me more or less the number of the beast" onclick="gAlertNumber();"
</body>
</html>
也就是说,您设置"全局"函数的方法不是很漂亮。例如,我非常喜欢这里描述的模式。
下面是一个例子,
(function() {
console.log(1);
// Local variable that ends up within closure
var num = 666;
var sayAlert = function() { console.log(num); }
num++;
return sayAlert();
})();
这将在定义后立即调用。
所以使用你的代码,
function setupSomeGlobals() {
var num = 666;
// Store some references to functions as global variables
gAlertNumber = function() {console.log(1); alert(num); }
gIncreaseNumber = function() { num++; }
gSetNumber = function(x) { num = x; }
gAlertNumber();
}
setupSomeGlobals();
在这里,您可以在父函数setupSomeGlobals()
内部调用子函数gAlertNumber()
,而不能在父函数外部访问它。
后调用它,这意味着不要调用父函数中的gAlertNumber()
。 调用父函数后调用它,
function setupSomeGlobals() {
// Local variable that ends up within closure
var num = 666;
// Store some references to functions as global variables
gAlertNumber = function() {console.log(1); alert(num); }
gIncreaseNumber = function() { num++; }
gSetNumber = function(x) { num = x; }
}
setupSomeGlobals();
gAlertNumber();
从 setSomeGlobals(( 返回一个包含这三个方法的对象。通过此对象,您将能够访问感兴趣的函数并操作 num 并保持其状态,但您将无法直接访问 num。这被称为模块模式,一种闭包应用。
好吧,
这将在浏览器中工作
gAlertNumber 被视为窗口属性。这与调用相同
window.gAlertNumber()
所以在你的 setSomeGlobals 中,你将函数对象分配给未定义的窗口属性。然后关闭该对象内的局部变量 num,该变量已在窗口对象内创建。因此,您可以从窗口范围访问它。
相关文章:
- for循环中的JavaScript闭包
- Javascript闭包-如何防止内存泄漏
- Javascript.闭包和dynamic'这'实际上具有约束力
- 如何告诉闭包javascript编译器不要混淆webkitAudioContext的方法名称
- 如何使用外部Javascript库(如jQuery)重命名Google闭包样式表
- 就良好实践而言,带闭包的javascript原型是一件好事吗
- 闭包中的Javascript值
- 用于添加两个数字的javascript闭包的用法
- 什么'这个javascript闭包的区别是什么
- javascript,将参数传递给函数内部的闭包中的回调
- javascript中的闭包对我来说工作方式不同
- 我可以使用JavaScript闭包添加数字吗
- 在Javascript中使用闭包
- 这是在JavaScript中形成闭包的正确方法吗
- 作用域问题-此函数是否形成闭包-JavaScript
- JavaScript - 为什么这个闭包不保存参数
- javascript闭包:保护内部变量
- 如何测试只在闭包范围中可见的javascript方法
- JavaScript闭包&回调函数
- 闭包 JavaScript 有助于理解示例