首页IT科技this指针用法(JavaScript:this指针)

this指针用法(JavaScript:this指针)

时间2025-06-20 16:32:32分类IT科技浏览4772
导读:this指针,存储的是一个内存地址,如同变量一样,指向一块内存区域;...

this指针             ,存储的是一个内存地址                   ,如同变量一样       ,指向一块内存区域;

而这个内存区域       ,保存的就是一个对象的数据                   ,那么这个对象是什么呢?

通常来说             ,this指针       ,主要是用在方法(函数)中                    ,用来指向调用方法(函数)的对象;

比如说             ,有个方法eat(),这个方法里面有个this指针;

当Tom调用eat时                    ,this指针指向的就是"Tom";

当Jerry调用eat时                    ,this指针指向的就是"Jerry";

也就是说,this指针             ,总是指向直接调用者             。

好                    ,现在我们来看一下       ,两个不同于上面所述规则的特殊情况:

             ”没有“调用者

看下面代码:

我们知道             ,如果是使用var声明的变量                   ,实际上是成为了window对象的方法       ,那么aaa()实际上就是window.aaa()       ,也就是省略了window的写法                   ,那么             ,this指向的就是window对象       ,我们可以理解;

但是                    ,上面我们使用let声明的变量             ,为什么this指向的还是window对象呢?

要知道,let声明的函数                    ,并不是window对象的方法                    ,window对象也无法调用,那么此时aaa()是由谁调用的呢?我们现在无法得知             ,但是可以肯定的是                    ,绝对不是window对象;

再来看函数aab()       ,虽然它是function声明的函数             ,但是因为它是在代码块中声明的                   ,所以它也不是window对象的方法       ,那么aab()又是被谁调用的呢?为什么它的this指针       ,也指向window对象呢?

事实上                   ,这是历史遗留问题             ,如果我们开启了严格模式       ,此时两个this将都会是undefined                    ,这是符合逻辑的             ,既然“没有                    ”调用者,那么this就没有指向                    ,当然就是undefined;

如下所示                    ,就印证了我们前面所说的:

箭头函数没有this指针

首先说明,箭头函数             ,确实没有自己的this指针;

也就是说                    ,箭头函数里面的this       ,并不能指向调用箭头函数的对象;

那么             ,此时this                   ,指向的是谁呢?

看下面代码:

我们将上图与上上图进行比较       ,仔细观察一下输出结果的不同;

在严格模式下       ,上图三个this指向的都是window对象                   ,与上上图完全不一样             ,这至少说明       ,箭头函数的this                    ,和function声明的函数的this             ,有不同的表现;

再看下面这个代码:

上图与上上图的区别,就是在最后一行代码                    ,我们将obj1作为obj2的一个对象                    ,从而再多一次调用arrow()方法,结果依然还是指向window对象             ,似乎无论增加多少次中间调用者                    ,最终都会指向window对象       ,说明箭头函数的this             ,并不是在指向调用箭头函数的对象;

现在我们尝试                   ,将箭头函数arrow的可见性       ,降低一些       ,看下面的代码:

上图将箭头函数内arrow的可见性                   ,控制在了用关键字function声明的函数外arrow内部             ,这样       ,要使用箭头函数                    ,就得调用外arrow;

对于arrow()             ,上面我们已经讨论过,此时外arrow函数“没有      ”调用者                    ,所以this是undefined;

对于obj1.arrow()                    ,此时this指向,调用外arrow函数的obj1;

对于obj2.arrow()             ,此时this指向                    ,调用外arrow函数的obj2;

对于obj2.obj1.arrow()       ,此时this指向             ,调用外arrow函数的obj1                   ,注意       ,此时obj2调用obj1       ,而obj1调用外arrow函数                   ,所以this指向obj1;

可以看到             ,this的表现       ,完全就是外arrow函数的this指针的表现;

也就是说                    ,此时             ,箭头函数的this,其实并不属于箭头函数                    ,而是属于包围箭头函数的外部代码块                    ,在这里也就是指外arrow函数;

所以,在考虑箭头函数的this指针的指向的时候             ,我们完全可以把箭头函数当成一般的执行语句                    ,而不是一个函数       ,这也是为什么说箭头函数没有this指针的缘故;

现在回过头看上上图             ,我们就能理解                   ,此时箭头函数是直接在script标签中的       ,作为一个普通的执行语句       ,它的外层只剩下浏览器窗口                   ,也就是window对象了             ,所以这些this指针才全部指向window对象;

总结:

this指针       ,总是指向它所在函数体的直接调用者; 直接函数名()这样“没有             ”调用者的函数调用                    ,在严格模式下             ,this为undefined;在普通模式下,this指向window对象; 箭头函数没有this指针                    ,此时将箭头函数当做一般语句                    ,this指针属于箭头函数所在的函数体的直接调用者;而且注意,如果箭头函数是全局作用域的话             ,无论什么模式                    ,this总是指向window对象;

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
python 爬取 app(使用phantomjs抓取ITC和android market的安装统计数据 | 蓝色的华)