对象的方法(函数),初识this关键字
发布日期:2021-06-29 11:42:54
浏览次数:2
分类:技术文章
本文共 2183 字,大约阅读时间需要 7 分钟。
如果一个函数不是 JavaScript 对象的方法,那么它就是全局对象的函数。
var xiaoming = { name: '小明', birth: 1990, age: function () { var y = new Date().getFullYear(); return y - this.birth; }};age的value是一个对象的方法,它在内部使用了一个this关键字xiaoming.age; // function xiaoming.age()xiaoming.age(); // 今年调用是25,明年调用就变成26了
方法内部的this变量,this是一个特殊变量,始终指向当前对象,所以this.birth可以拿到xiaoming
的birth
属性。
JavaScript的函数内部如果调用了this
,那么这个this
的指向视情况而定。
function getAge() { var y = new Date().getFullYear(); return y - this.birth;}var xiaoming = { name: '小明', birth: 1990, age: getAge};xiaoming.age(); // 25, 正常结果,说明this指向的是xiaoming这个对象getAge(); // NaN,说明this没有指向xiaoming这个对象。实际上指向的是全局对象,也就是window。更坑爹的是,如果下面这么写也是不行的!要保证this指向正确,必须用obj.xxx()的形式调用!var fn = xiaoming.age; // 先拿到xiaoming的age函数fn(); // NaN,和预期的不一样,没有返回错误告知
ECMA决定,在strict模式下让函数的this
指向undefined
,因此,在strict模式下,会得到一个错误:
'use strict';var xiaoming = { name: '小明', birth: 1990, age: function () { var y = new Date().getFullYear(); return y - this.birth; }};var fn = xiaoming.age;报错,必须用obj.xxx()的形式调用fn(); // Uncaught TypeError: Cannot read property 'birth' of undefined
that
关键词:
在 JavaScript 中,被称为 this 的事物,指的是“拥有”当前代码的对象。this 的值,在函数中使用时,是“拥有”该函数的对象。请注意 this 并不是变量。它属于关键词。您无法改变 this 的值。当不带拥有者对象调用对象时,this 的值成为全局对象。在 web 浏览器中,全局对象就是浏览器对象。
this
指针只在age
方法的函数内指向xiaoming
,在函数内部定义的函数,this
又指向undefined
了!(在非strict模式下,它重新指向全局对象window
!)。修复的办法也不是没有,我们用一个that
变量首先捕获this
:用var that = this;
,你就可以放心地在方法内部定义其他函数,而不是把所有语句都堆到一个方法中。
'use strict';var xiaoming = { name: '小明', birth: 1990, age: function () { function getAgeFromBirth() { var y = new Date().getFullYear(); return y - this.birth; // this处在函数里面的函数里面,那么指向的是默认的全局对象,由于使用strict模式所以是指向了undefined } return getAgeFromBirth(); }};xiaoming.age(); // Uncaught TypeError: Cannot read property 'birth' of undefined使用that变量则可以修正这个错误var xiaoming = { name: '小明', birth: 1990, age: function () { var that = this; // 在方法内部一开始就捕获this function getAgeFromBirth() { var y = new Date().getFullYear(); return y - that.birth; // 用that而不是this } return getAgeFromBirth(); }};xiaoming.age(); // 25
转载地址:https://blog.csdn.net/zz2230633069/article/details/108225431 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2024年05月01日 09时56分50秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
半导体芯片原厂涨价及调价声明新增了这些!
2019-04-29
为什么你学C++这么难?
2019-04-29
无人机破巡检难题,秒变电网卫士
2019-04-29
五年,我成为了一名嵌入式工程师。
2019-04-29
2020年电赛题目,命题专家们怎么看?
2019-04-29
PCB元器件摆放不可忽略的10个技巧
2019-04-29
掌握AI核心技术没有秘籍,能自己创造就是王道
2019-04-29
大学老师的月薪多少?实话实说:4万多一点……
2019-04-29
2020年电赛题目,命题专家权威解析!
2019-04-29
如何掌握“所有”的程序语言?没错,就是所有!
2019-04-29
39岁单身程序员入住养老院
2019-04-29
写论文,这个神器不能少!
2019-04-29
我在哥大读博的五年,万字总结
2019-04-29
本科、硕士、博士,究竟有何区别?
2019-04-29
如果我的实验室也这样布置,那多好。
2019-04-29
现在做硬件工程师还有前途吗?
2019-04-29
用 50 种编程语言写“Hello,World!”
2019-04-29
GD32替换STM32,这些细节一定要知道。
2019-04-29
华为员工离职心声:菊厂15年退休,感恩,让我实现了财务自由!
2019-04-29
春晚上的“拓荒牛”
2019-04-29