1
Lax 2018-09-06 01:25:18 +08:00
那个匿名函数访问到了创建它时的环境变量 helpText。
只要具备这种访问局部变量的能力就是个闭包。不能因为是原地执行就排除在外了,把这个函数 return 到外部调用方去执行和原地执行没有任何差别。 |
2
Shy07 2018-09-06 08:50:49 +08:00 via iPhone
个人理解:closure 就是封闭的代码块,closure 内部可以访问所在 binding 环境,而 closure 内部环境对外是不可访问的,同时 closure 可以作为参数传递。
至于 closure 内部可以访问到正常情况访问不到的对象不过是 closure 的一个特性和使用方法而已。你见到一只会飞的鸭子,你不能在它不飞时,就说它不是鸭子了。 |
4
robinlovemaggie 2018-09-06 12:57:32 +08:00 via Android
开包我会,闭包是真 TMD 蛋疼
|
5
gooqiao OP @Shy07
如果是这样的话,那是不是就可以认为,只要在函数内部定义的函数用到了外部函数的对象都可以被看错是闭包。 但是这个内部函数所在的执行环境本就拥有对外部函数定义的对象的访问权限,并没有什么特殊的地方。 这也是我之所以认为上面代码不形成闭包的原因。 不知大佬你怎么看? |
6
Shy07 2018-09-06 16:23:35 +08:00
@gooqiao
例子中的代码和下面的代码应该是等效的,看到 bind 就可以视作使用了闭包,我是这么认为的 ```javascript function showHelp(help) { document.getElementById('help').innerHTML = help; } function setupHelp() { var helpText = [{ 'id': 'email', 'help': 'Your e-mail address' }, { 'id': 'name', 'help': 'Your full name' }, { 'id': 'age', 'help': 'Your age (you must be over 16)' } ]; for (var i = 0; i < helpText.length; i++) { var item = helpText[i]; document.getElementById(item.id).onfocus = showHelp.bind('item', item.help); } } ``` 另外,**我不是大佬** |