JS中关于call()方法的一个问题(转自百度知道,解答非常详细清楚)
2013-05-26 18:19
543 查看
S中关于call()方法的一个问题,如图中所示,求高手详解。
http://zhidao.baidu.com/question/540737532.html2013-04-13 14:11
fengye1800 | 分类:JavaScript
| 浏览46次
提问者采纳
2013-04-13 15:41
在分析这四种代码前,首先得弄清楚,如果一个对象obj调用了f函数,这个obj会发生什么样的变化。 obj.f(); 上面的代码中对象obj调用了f函数,在f函数里,第一句是this.a = 'A'。那么这个this是指什么?如果你不清楚,那我直接说好了。this就是只那个调用f函数的对象,显然在这里是obj。那么this.a = 'A'实际上就是obj.a = 'A',也就是说,obj多了一个属性a,其值为A。同样的道理,第二句代码给obj添加了一个属性b,其值是一个函数,alert出一个B。 明白了吗?obj.f()的直接影响就是obj.a = 'A',obj.b = function(){alert('B')}。 弄明白了obj.f()的影响,接下来要搞清楚的就是f.call(obj)是一种怎么样的调用。如果你了解call这个函数,你可以知道的更多些;如果你不了解,希望你自己去仔细研究下,我这里只能直接告诉你: f.call(obj)相当于obj.f() 看到了吗,这就是为什么要先讲清楚obj.f()的影响。因为f.call(obj)其实就是obj.f()。 此时再来看这四种调用。 第一种: 首先来看看第一句,根据前面的分析,我们知道,此时e.a = 'A'。那么第二句干了什么呢?第二句alert(a),显然这a和e是没有关系的,由于变量a事先没有定义,在js中不能直接使用未定义的变量,alert(a)其实出错了,所以你没有看到任何反应。但如果你使用开发者工具,就能看到,这样的写法已经报错了。错误的代码,自然没有任何反应。 第二种: 第二种比较绕,还是来看看它的调用过程吧。f.call(e.t),这个e.t是什么?因为e没有t这个属性,所以这句相当于f.call(undefined)。当call函数的第一个参数是undefined或者null时,f.call(undefined)就相当于f(),也相当于window.f()。那么根据开头的分析,这时f函数的调用者就是window了,也就是说window.a =' A'了。第二句alert(a),显然在函数e的作用域里,变量a是不存在的,所以js会到window的作用域去查找属性a,而window的属性a是有的,它的值是A,所以这个时候alert(a)就是alert(window.a),alert的结果就是A。 第三种: 我觉得看了前两种调用的分析,你应该知道f.call(y.t)相当于什么,它相当于y.t.f(),但遗憾的是,y这个变量并没有定义,无论是在函数e的作用域内还是window的作用域内,y都是不存在的,而使用一个未定义的变量,是一种错误的语句,所以带三种调用和第一种一样,是错了,alert(a)根本就没有执行,因此没有任何反应;当然,就算执行了alert(a)也是错的,它和第一种调用的错误就一样了。 第四种: 第四种应该是比较容易理解的了。根据开头的分析,f.call(e),e.a = 'A',这个没有意见吧?所以第二句alert(e.a)就alert出了A。
提问者评价
很谢谢你,讲的很透彻。
相关文章推荐
- 关于a标签中js函数function(va1,va2)方法传递中文参数报错不执行的问题解答
- 关于c++中的一个母牛生小牛的问题详细解答与体会
- 关于Qt编译时问题的一个非常奇怪的解决方法
- 百分求解一个可能涉及比较多的一个有关问题,求熟悉javascript或者ASP无组件上传或者AJAX等等的高手帮忙解答,非常感谢!
- 关于vb.net里面api Unicode/ANSI调用一个问题解答
- 关于C++中子类调用父类方法的一个问题
- 谈谈关于js中关于函数的apply和call方法的理解
- 关于ASP.NET“操作必须使用一个可更新的查询”问题的解决方法
- 一个关于ConfigurationManager.GetSecion方法的小问题
- DataGuard - 一个关于Physical Standby中recover问题的解决方法
- 关于在Js中使用ThinkPHP的U方法传递参数的问题
- 关于解决JS中方法名重复问题的简单办法
- 关于js 方法,实现ajax请求时,return false/true无效的问题
- 关于 clock_gettime() 的一个问题以及解决方法
- 关于angular瀑布流插件ng-infinite-scroll.min.js遇到一个奇葩问题
- 一个关于js函数的传值问题
- 关于微博api授权问题求一个详细步奏
- 关于JS调用Java后台API跨域问题的解决方法
- 关于BufferedInputStream类的mark与reset方法的一个bug的问题
- vector::erase()方法的详细介绍及问题解答