前言

Javascript是一门基于对象的动态语言,也就是说,所有东西都是对象,一个很典型的例子就是函数也被视为普通的对象。Javascript可以通过一定的设计模式来实现面向对象的编程,其中this “指针”就是实现面向对象的一个很重要的特性。本文将给大家详细介绍关于Javascript中this关键字指向的相关内容,让我们先做一个小测试,如果全部答对了,恭喜你不用往下看了。
测试题目
第一题
<script>
var str = 'zhangsan';
function demo() {
var str = 'lisi';
alert(this.str);
}
window.demo(); // ??
var obj = {
str: "wangwu",
say: function() {
alert(this.str);
}
}
obj.say(); // ??
var fun = obj.say;
window.fun(); // ??
</script>
第二题
<script>
var username = 'zhangsan';
(function() {
var username = 'lisi';
alert(this.username); // ??
})()
function demo() {
var username = 'wangwu';
function test() {
alert(this.username);
}
test(); // ??
}
demo();
</script>
第三题
<script>
function Person() {
this.username = 'zhangsan';
this.say = function() {
alert('我叫' + this.username);
}
}
var p = new Person();
p.say(); // ??
var p1 = new Person();
p1.say(); // ??
</script>
第四题
<script>
var username = 'zhangsan';
function demo() {
alert(this.username)
}
var obj1 = {
username: "lisi"
};
var obj2 = {
username: "wangwu"
};
demo(); // ??
demo(obj1); // ??
demo(obj2); // ??
demo.call(obj1); // ??
demo.apply(obj2); // ??
</script>
答案
(往下看,下面有详细解析哦)
this
一、指向调用函数的对象
<script>
// this:指向调用函数的对象
var str = 'zhangsan';
function demo() {
var str = 'lisi';
//this->window
console.log(this);
alert(this.str);
}
window.demo(); // zhangsan
var obj = {
str: "wangwu",
say: function() {
// this->obj
alert(this.str);
}
}
obj.say(); // wangwu
var fun = obj.say;
window.fun(); // zhangsan
</script>
二、无对象调用函数/匿名函数自调用->this指向window
<script>
// 2.匿名函数自执行|匿名函数|无主函数 this->window
var username = 'zhangsan';
// 匿名函数自执行 this->window
(function() {
var username = 'lisi';
console.log(this); // window
alert(this.username); // zhangsan
})()
function demo() {
var username = 'wangwu';
// 无主函数 this->window
function test() {
// this->window
alert(this.username);
}
test(); // zhangsan
}
demo();
</script>
三、通过new产生的对象
<script>
// 3.通过new的对象:this指向产生的对象
// 函数
function Person() {
// 属性
this.username = 'zhangsan';
// 方法
this.say = function() {
// this->p
console.log(this); // Person对象
alert('我叫' + this.username);
}
}
// 实例化出一个对象:p就具有了username属性和say方法
var p = new Person();
console.log(p); // Person对象
console.log(p.username); // zhangsan
p.say(); // 我叫zhangsan
// this->p1
var p1 = new Person();
p1.say(); // Person对象 我叫zhangsan
</script>
四、apply/call调用
首先我们来了解下apply()/call()是个什么东西呢?
apply()/call():最终是调用function,只不过内部的this指向了thisObj
function.call([thisObj[,arg1[, arg2[, [,.argN]]]]]) function.apply([thisObj[,argArray]])
注意:
1. 调用function函数,但是函数内的this指向thisObj(更改对象内部指针)
2. 如果thisObj没有传参,则默认为全局对象
3. call()/apply()联系与区别
联系:功能一样,第一个参数都是thisObj
区别:传递的参数如果比较多
call()的实参就是一一列出
apply()的实参是全部放置在第二个数组参数中
一个理解apply()/call()的实例:
<script>
// apply()/call()
function demo() {
console.log(123);
}
// 调用函数的时候,demo.call()/demo.apply()最终调用的还是demo()
demo(); // 123
demo.call(); //123
demo.apply(); // 123
</script>
<script>
// call()/apply()的区别:
// call()参数单独再call中罗列
// apply()的参数通过数组表示
function demo(m, n, a, b) {
alert(m + n + a + b);
}
demo(1, 5, 3, 4); // 13
demo.call(null, 1, 5, 3, 4); // 13
demo.apply(null, [1, 5, 3, 4]); // 13
</script>
this的第四个用法实例
<script>
// this的第四个用法:call(obj)/apply(obj):强制性的将this指向了obj
var username = 'zhangsan';
function demo() {
alert(this.username)
}
var obj1 = {
username: "lisi"
};
var obj2 = {
username: "wangwu"
};
// call()/apply():打劫式的改变了this的指向
demo(); // zhangsan
demo(obj1); //zhangsan
demo(obj2); //zhangsan
demo.call(obj1); // lisi
demo.apply(obj2); // wangwu
</script>
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
# javascript
# this指向
# this
# this的指向问题
# javascript的this关键字详解
# JavaScript调用模式与this关键字绑定的关系
# JS作用域闭包、预解释和this关键字综合实例解析
# javascript中this关键字详解
# 精通JavaScript的this关键字
# 关于js里的this关键字的理解
# JavaScript this关键字指向常用情况解析
# 我叫
# 都是
# 第一个
# 无主
# 它就
# 面向对象
# 的是
# 一个函数
# 来了
# 看了
# 相关内容
# 让我们
# 才是
# 可以通过
# 第二个
# 很重要
# 详细介绍
# 当我们
# 这篇文章
# 谢谢大家
相关文章:
网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?
香港服务器选型指南:免备案配置与高效建站方案解析
建站之星安装后界面空白如何解决?
建站之星ASP如何实现CMS高效搭建与安全管理?
详解jQuery中基本的动画方法
如何访问已购建站主机并解决登录问题?
c# F# 的 MailboxProcessor 和 C# 的 Actor 模型
网站制作的步骤包括,正确网址格式怎么写?
网站制作费用多少钱,一个网站的运营,需要哪些费用?
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
网站制作专业公司有哪些,如何制作一个企业网站,建设网站的基本步骤有哪些?
制作营销网站公司,淘特是干什么用的?
北京网站制作的公司有哪些,北京白云观官方网站?
建站之星微信建站一键生成小程序+多端营销系统
唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?
Android自定义listview布局实现上拉加载下拉刷新功能
linux top下的 minerd 木马清除方法
常州自助建站工具推荐:低成本搭建与模板选择技巧
制作企业网站建设方案,怎样建设一个公司网站?
音响网站制作视频教程,隆霸音响官方网站?
武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?
如何在宝塔面板中修改默认建站目录?
简单实现Android验证码
网站制作大概多少钱一个,做一个平台网站大概多少钱?
如何通过虚拟机搭建网站?详细步骤解析
重庆市网站制作公司,重庆招聘网站哪个好?
如何用VPS主机快速搭建个人网站?
陕西网站制作公司有哪些,陕西凌云电器有限公司官网?
如何高效完成独享虚拟主机建站?
微信推文制作网站有哪些,怎么做微信推文,急?
公司门户网站制作流程,华为官网怎么做?
打鱼网站制作软件,波克捕鱼官方号怎么注册?
ui设计制作网站有哪些,手机UI设计网址吗?
济南网站制作的价格,历城一职专官方网站?
阿里云网站搭建费用解析:服务器价格与建站成本优化指南
如何破解联通资金短缺导致的基站建设难题?
c# await 一个已经完成的Task会发生什么
如何通过宝塔面板实现本地网站访问?
如何通过WDCP绑定主域名及创建子域名站点?
建站主机默认首页配置指南:核心功能与访问路径优化
如何快速上传建站程序避免常见错误?
如何快速搭建高效WAP手机网站吸引移动用户?
山东云建站价格为何差异显著?
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
如何选择适合PHP云建站的开源框架?
建站之星与建站宝盒如何选择最佳方案?
用v-html解决Vue.js渲染中html标签不被解析的问题
江苏网站制作公司有哪些,江苏书法考级官方网站?
专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?
制作充值网站的软件,做人力招聘为什么要自己交端口钱?
*请认真填写需求信息,我们会在24小时内与您取得联系。