StackOverflow 上关于 JS 的热门问答

496 查看

Q1:javascript的闭包是如何工作的?

正如爱因斯坦所说的:

如果你不能把它解释给一个六岁的小孩,说明你对它还不够了解。

我曾尝试向一个27岁的朋友解释js闭包并且完全失败了。你会如何向一个有概念(例如,函数,变量等)的人解释,来弥补闭包知识,但不理解闭包本身?

Answers:

无论何时你看到function关键字在另一个函数内部,那么内部函数将可访问外部函数的变量。

这将总是弹出16,因为函数bar 可以访问变量 x ,它是作为foo参数定义的,也可以访问变量tmp

这就是一个闭包。函数没有任何返回的时候就被称为闭包。简单地访问即时词法作用域(immediate lexical scope)外的变量创建了一个闭包。

上面的函数也会弹出16,因为 bar 仍然可以指向 xtmp,即使它不再直接范围内。

然而,因为 tmp 仍然在bar的闭包内部闲逛,它也正在增加。每次你调用bar的时候它会被增加。
最简单的闭包的例子是这个:

当一个js函数被调用的时候,一个新的执行上下文环境就被创建了。函数参数和父对象一起,这个执行上下文也接收所有的外部声明的变量(在上面的例子,'a''b' 都是)

创建多个闭包函数是可能的,或者通过返回他们的列表,或者通过设置他们的全局变量。所有这些将指向同上面的xtmp,他们不会拷贝他们本身。

这里的数字 x 是字面量的数字。和js其他字面量一样,当foo被调用,数字 x 就被复制到 foo 内作为它的 参数 x

另一方面,当处理对象的时候,js总会使用引用。如果说,你用一个Object来调用foo,闭包将会返回最早引用的Object

果然,每次调用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

例如:

原文链接:http://stackoverflow.com/questions/503093/how-can-i-make-a-redirect-page-using-jquery

Q3:测试是否有东西被隐藏

问题描述: