我正在学习javascript,但我遇到了以下代码片段:
var outerValue = true;
function outerFn(){
assert( outerFn && outerValue, "These come from the closure." );
}
在我理解上述语境中的闭包的情况下,它们允许outerFn实际看到outerValue变量。
我的问题是:这与其他任何编程语言有什么不同 - 例如java?只是期望outerValue的范围允许outerFn看到它。
稍后补充:
var outerValue = true;
function outerFn() {
console.log(outerValue);
}
function anotherFunction(arg){
console.log("anotherFunction");
arg.call(this);
}
anotherFunction(outerFn);
那么这是一个更好的闭包示例吗?
答案 0 :(得分:2)
将“clousures”理解为改变函数或方法执行范围的能力。 这是一个例子,我们通过修改'may'和'client'的客户端2'的范围来运行相同的功能。这在Java中是不可能的。
<html>
<head>
<script type="text/javascript" src="jquery-1.5.2.min.js"></script>
<script type="text/javascript" >
function assert(condition, message) {
if (condition) {
alert(message);
}
}
function testClousures() {
var client1 = {name: 'Mary', code: 123};
var client2 = {name: 'John', code: 234};
function outerFn(){
assert( this.name == 'John', "These come from the closure." );
}
// Testing if client is John
outerFn.apply(client1); // Fail
outerFn.apply(client2); // Success
}
function domReady() {
$('#btn').click(function(){
testClousures();
});
}
</script>
</head>
<body onload="domReady()">
<br/>
<input id="btn" type="button" value="Test"></input>
</body>
</hmtl>
答案 1 :(得分:1)
想象一下,函数outerFn()
作为回调传递。在运行之后的某个时间,即使outerValue
已经超出范围,它仍然可以在闭包内访问。
HTH
答案 2 :(得分:1)
您的示例并未真正说明差异,因为您没有定义outerValue的范围。在Javascript中,您可以在任何一个内部任意地嵌套函数,并且闭包确保内部函数即使在外部函数不再在范围之外被调用时也可以看到外部函数。
在java中,嵌套函数尚未合法,因此闭包甚至不起作用。使用类字段代替outerValue
和类方法代替函数是不同的,因为字段当然与类的范围相关联,而不是方法。