项目中有个需求,事件第一次执行(立即执行)与后几次执行不同,但是传递具名函数,返回结果一样。。如果通过匿名函数内再嵌套具名函数,结果就能返回正确!代码如下:
//上面这个代码初始化打印1,之后点击也一直打印1。
//上面这个代码初始化打印1,之后点击打印2。
之前jquery写的,以为是jquery问题,原生测试也一样(chrome环境下)!
尝试过从几个地方理解(执行时上下文,运行时上下文,事件调用,都不能理解),既然都是内存地址引用,按道理应该都是返回第二段代码的结果,不理解。
项目中有个需求,事件第一次执行(立即执行)与后几次执行不同,但是传递具名函数,返回结果一样。。如果通过匿名函数内再嵌套具名函数,结果就能返回正确!代码如下:
//上面这个代码初始化打印1,之后点击也一直打印1。
//上面这个代码初始化打印1,之后点击打印2。
之前jquery写的,以为是jquery问题,原生测试也一样(chrome环境下)!
尝试过从几个地方理解(执行时上下文,运行时上下文,事件调用,都不能理解),既然都是内存地址引用,按道理应该都是返回第二段代码的结果,不理解。
闭包的作用。
第一个例子,由于执行上下文的关系,每次click都是从script的从上至下执行的。所以每次执行的都是console.log(1)
的fn;
而第二个例子事件监听中的是一个匿名函数,里面还有一个函数,这实际上形成了一个闭包,后来定义的console.log(2)
的fn就被留在执行环境了,后来每次click就直接调用执行环境中的fn了。
13 回答13k 阅读
7 回答2.1k 阅读
3 回答1.3k 阅读✓ 已解决
6 回答1.2k 阅读✓ 已解决
2 回答1.4k 阅读✓ 已解决
3 回答1.3k 阅读✓ 已解决
6 回答1.1k 阅读
这么说吧,
第一张,定义了一个函数
fn = o1
添加事件监听函数相当于把其赋值到另一个变量。即eventfn = fn;
那么后面在执行fn = o2
的时候eventfn
还是o1
,不会因为fn
变成了也变成o2。第二张,定义了一个函数
fn = o1
,然后eventfn
是另外一个匿名函数(不是fn),其中使用了fn
。所以后面fn = o2
那么 eventfn 运行的时候调用的 fn() 就是输出 2 呀。