扫码关注官方订阅号
调用测试
在网上偶然浏览到的,有点混乱,为什么通过callWithClosure()调用那段中的this指向是testObj对象?还有callWithClosure()里新建的回调函数的闭包不是function testCall(){...}吗,"通过Closure保持上下文回调"是什么意思?
callWithClosure()
testObj
function testCall(){...}
ringa_lee
事先声明我也是学生,说的内容可能有误,欢迎拍砖讨论。
上下文 === 执行上下文 === 执行环境 === (Execution Context),阅读英文文档发现只是翻译的问题,我觉得翻译成执行环境好理解多了。
js闭包网上的解释很多,我觉得很多是错的,我只引用尼古拉斯红宝书上的原文(闭包:指有权访问另一个函数作用域中的变量的函数。)
this对象是超级延时绑定,也就是函数加上小括号调用运行的时候它才会绑定执行环境,除非通过call、apply、bind给它指定。(原文:在全局函数 中,this等于window;当函数作为某个对象的方法调用时,this等于那个对象。不过,匿名函数的执行环境具有全局性)。所以遇到闭包嵌套的时候最里层的this一般都是指向window。
我的理解,第一个callMethod(testObj.callback)相当于window.callMethod(testObj.callback),将testObj内的callback函数作为参数传入callMethod,testObj.callback只是一个指向callback函数的引用,指针,并不在乎testObj.callback还是xxx.callback,真正的执行环境还是window。
第二个与第一个不同之处在于...(还没想好怎么说= =)
调用的时候相当于:
callWithClosure(function ("通过Closure保持上下文回调") { testObj.callback("通过Closure保持上下文回调"); });
可见此时callback是作为testObj的方法调用的,所以this指向testObj对象。
第三个比较好理解,call()或apply()绑定this之后就没跑了。
第一次这么认真地回答问题,写了一个多小时,给个赞吧~(>﹏<)
闭包是指测试对象里的回调函数,所以导致this指向测试对象
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
事先声明我也是学生,说的内容可能有误,欢迎拍砖讨论。
上下文 === 执行上下文 === 执行环境 === (Execution Context),阅读英文文档发现只是翻译的问题,我觉得翻译成执行环境好理解多了。
js闭包网上的解释很多,我觉得很多是错的,我只引用尼古拉斯红宝书上的原文(闭包:指有权访问另一个函数作用域中的变量的函数。)
this对象是超级延时绑定,也就是函数加上小括号调用运行的时候它才会绑定执行环境,除非通过call、apply、bind给它指定。(原文:在全局函数 中,this等于window;当函数作为某个对象的方法调用时,this等于那个对象。不过,匿名函数的执行环境具有全局性)。所以遇到闭包嵌套的时候最里层的this一般都是指向window。
我的理解,第一个callMethod(testObj.callback)相当于window.callMethod(testObj.callback),将testObj内的callback函数作为参数传入callMethod,testObj.callback只是一个指向callback函数的引用,指针,并不在乎testObj.callback还是xxx.callback,真正的执行环境还是window。
第二个与第一个不同之处在于...(还没想好怎么说= =)
调用的时候相当于:
可见此时callback是作为testObj的方法调用的,所以this指向testObj对象。
第三个比较好理解,call()或apply()绑定this之后就没跑了。
第一次这么认真地回答问题,写了一个多小时,给个赞吧~(>﹏<)
闭包是指测试对象里的回调函数,所以导致this指向测试对象