扫码关注官方订阅号
网上的资料说apply/call传null或者undefined,指向的window对象,但是我 aa.show.call(null),为什么没有指向全局定义的show方法呢。返回一个undefined?
人生最曼妙的风景,竟是内心的淡定与从容!
首先,我们来看看文档里关于apply是怎么说的:
apply
注意我选中的部分,只有在"非严格模式"下,你说的null,undefined才会使this指向全局对象(如果在浏览器里就是window)
null
undefined
this
window
这是你提问的第一个问题!
第二个问题,你调用的就是aa.show.call,都这么明确指定了,她还怎么“指向全局定义的show方法”?这不科学啊,我看你是没搞清楚那个“全局”到底应该作用在哪里。
aa.show.call
举个栗子:
//全局定义变量test var test = 'fuck'; //再定义一个全局的对象obj var obj = { test: 'Hello', say: function(){ console.log(this.test); } }; //现在我们直接调用say方法 obj.say();//这里的this你猜是谁?答案是:obj本身,所以这里打印出来的是Hello //再来通过call方法修改this obj.say.call(null);//这里的this因为被null替换成全局对象了,那打印出来的当然是window.test,就应该是fuck
这么说能理解了么?
参考 https://segmentfault.com/q/1010000005119238/a-1020000005630803
undefined是语句返回值
初学。。错了请指出,大神轻拍。。。
var aa = { a:"hehe", show:function(){alert(this.a)} } aa.show.call(null) //1,call这个方法改变的是函数的this。 (显然,你理解的“为什么没指向全局定义的show方法”是不正确的, call改变了show函数的this,并不是改变了aa这个对象的元素。) //2,因为call改变的是aa.show函数的执行上下文(this),所以aa是aa.show 的caller。 //3,aa.show.call(null),在非严格模式下指向window, 那么this是window,也就相当于 window.show(this.a), 因为 window.a没有定义,所以,是undefined。
另外补充this知识,理解了下面三行,基本 执行环境这块,就算是入门了。
var name = "The Window"; obj = {name:"obj", sayName : function (){ console.log(this.name); } } obj.sayName(); (obj.sayName)(); (obj.sayName = obj.sayName)(); //非严格模式下
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
首先,我们来看看文档里关于
apply是怎么说的:这是你提问的第一个问题!
第二个问题,你调用的就是
aa.show.call,都这么明确指定了,她还怎么“指向全局定义的show方法”?这不科学啊,我看你是没搞清楚那个“全局”到底应该作用在哪里。举个栗子:
这么说能理解了么?
参考 https://segmentfault.com/q/1010000005119238/a-1020000005630803
undefined是语句返回值
初学。。错了请指出,大神轻拍。。。
另外补充this知识,理解了下面三行,基本 执行环境这块,就算是入门了。