Q1:javascript的闭包是如何工作的?
正如爱因斯坦所说的:
如果你不能把它解释给一个六岁的小孩,说明你对它还不够了解。
我曾尝试向一个27岁的朋友解释js
闭包并且完全失败了。你会如何向一个有概念(例如,函数,变量等)的人解释,来弥补闭包知识,但不理解闭包本身?
Answers:
无论何时你看到function
关键字在另一个函数内部,那么内部函数将可访问外部函数的变量。
1 2 3 4 5 6 7 8 9 10 11 |
function foo(x) { var tmp = 3; function bar(y) { alert(x + y + (++tmp)); // will alert 16 } bar(10); } foo(2); |
这将总是弹出16
,因为函数bar
可以访问变量 x
,它是作为foo
参数定义的,也可以访问变量tmp
。
这就是一个闭包。函数没有任何返回的时候就被称为闭包。简单地访问即时词法作用域(immediate lexical scope
)外的变量创建了一个闭包。
1 2 3 4 5 6 7 8 9 10 |
function foo(x) { var tmp = 3; return function (y) { alert(x + y + (++tmp)); // will also alert 16 } } var bar = foo(2); // bar is now a closure. bar(10); |
上面的函数也会弹出16,因为 bar
仍然可以指向 x
和 tmp
,即使它不再直接范围内。
然而,因为 tmp
仍然在bar
的闭包内部闲逛,它也正在增加。每次你调用bar
的时候它会被增加。
最简单的闭包的例子是这个:
1 2 3 4 5 6 7 8 9 |
var a = 10; var b = 6; function test() { console.log(a); // will output 10 console.log(b); // will output 6 } test(); |
当一个js
函数被调用的时候,一个新的执行上下文环境就被创建了。函数参数和父对象一起,这个执行上下文也接收所有的外部声明的变量(在上面的例子,'a'
和 'b'
都是)
创建多个闭包函数是可能的,或者通过返回他们的列表,或者通过设置他们的全局变量。所有这些将指向同上面的x
和tmp
,他们不会拷贝他们本身。
这里的数字 x
是字面量的数字。和js
其他字面量一样,当foo
被调用,数字 x
就被复制到 foo
内作为它的 参数 x
另一方面,当处理对象的时候,js
总会使用引用。如果说,你用一个Object
来调用foo
,闭包将会返回最早引用的Object
1 2 3 4 5 6 7 8 9 10 11 12 13 |
function foo(x) { var tmp = 3; return function (y) { alert(x + y + tmp); x.memb = x.memb ? x.memb + 1 : 1; alert(x.memb); } } var age = 2; var bar = foo(age); // bar is now a closure referencing age. bar(10); |
果然,每次调用bar(10)
都将增加x.memb
。这也许不是所预期的,x
仅仅是指向同样的对象 作为age
变量!经过几次调用bar
之后,age.memb
将是2!这是与HTML
对象引用的内存泄漏的基础
原文链接:http://stackoverflow.com/questions/111102/how-do-javascript-closures-work
Q2:我如何使用jQuery做一个重定向页面?
jQuery
是没有必要的,并且window.location.replace(...)
将最佳模拟HTTP
重定向。
这比使用window.location.href =
要好,因为replace()
并不把起始页放入会话历史(session history
)里,这意味着用户不会陷入永无休止的后退按钮的窘境。如果你想要模拟人点击一个链接,请使用location.href
。如果要模拟一个HTTP
重定向,使用location.replace
。
例如:
1 2 3 4 5 |
// 类似HTTP重定向的行为 window.location.replace("http://stackoverflow.com"); // 类似点击一个链接的行为 window.location.href = "http://stackoverflow.com"; |
原文链接:http://stackoverflow.com/questions/503093/how-can-i-make-a-redirect-page-using-jquery