javascript练习题

  • 1.this指向(小试牛刀)
  • 2.this指向(难度提升)
  • 3.this指向(难度升级)
  • 4.this指向:
  • 5.this指向
  • 6.this指向

  使用 JavaScript 开发的时候,很多人多多少少都会被 this 的指向问题搞蒙圈,但是实际上,关于 this 的指向,记住最核心的一句话:哪个对象调用函数,函数里面的this指向哪个对象。

接下来我们看看几个例子:

1.this指向(小试牛刀)

 <script type="text/javascript">function test(a){this.b = a;console.log(this);}test(3);console.log(b);//3  这里相当于与访问window.b</script>

运行结果:

  1.因为test函数是在整个window对象中,当我们调用test函数时,相当于window.test(3),所以此时的this指向window。
  2.因为函数中有this.b,又因为this指向,所以在调用时,给window对象添加了一个b属性

2.this指向(难度提升)

<script type="text/javascript">var obj = {a:1,c:2,say:function(a){console.log("this1: "+this);var sayA = function(a){console.log("this2: "+this);this.a = a;};function sayC(){console.log("this3: "+this);}sayA(a);sayC()}}obj.say(3);console.log(obj.a+"  "+obj.c);console.log(window.a+"  "+window.c);
</script>

运行结果:

是不是跟想的有点不一样呢?
我们要记住这句话:哪个对象调用函数,函数里面的this指向哪个对象。
  1.当我们使用obj调用say函数时,say作为obj的属性,this当然会指向obj对象,所以this1指向的是obj对象
  2.为什么sayA中的this指向window呢,因为sayA函数被执行时默认被window调用,所以this指向window,此时还向window中添加了一个a属性
  3.sayC函数也是如此,默认被window调用

3.this指向(难度升级)

<script type="text/javascript">function Person(name,age){this.name = name;this.age = age;}var person1 = new Person("张三",18);var person2 = Person("李四",12);console.log(person1);console.log(person2);console.log(person1.name,person1.age);console.log(window.name,window.age);</script>

运行结果:

是不是又懵了?
  在这里补充一下new关键字的作用
    a.在构造函数代码开始执行前,创建一个空的对象
    b.修改this的指向,把this指向刚刚创建出来的空对象
    c.执行函数的代码
    d.在函数完成之后返回this–即创建出来的对象

  1.此时Person相当于构造函数,使用new关键字后,创建一个空对象,并将this指向这个对象,所以打印时person1是一个对象,里面有name和age属性
  2.为什么person2是undefined呢?此时的Person(“李四”,12) 相当于函数执行,没有返回值,所以person2为undefined。
  3.为什么window中有name和age属性可以打印?因为Person(“李四”,12)相当于window.Person(“李四”,12),所以Person函数执行时,将name和age属性添加到window中去了

4.this指向:

<script type="text/javascript">function Test(a, b) {this.a = a;this.b = b;this.say = function (a, b) {this.a = a;this.b = b;console.log(this);console.log(a, b);}}var obj1 = new Test(1, 1);console.log(obj1.a, obj1.b);obj1.say();console.log(obj1.a, obj1.b);var obj2 = { a: 2, b: 2 };obj1.say(4, 4)console.log(obj1.a,obj1.b);console.log("------------");obj1.say.call(obj2, 3, 3);console.log(obj2.a + "--" + obj2.b);//3--3</script>

运行结果:

是不是又又懵逼了??
我们一条一条的分析:
  1.首先我们可以知道,obj1是构造函数Test new出来的对象,所以打印属性a,b时,就是当时传参进去的值 (1 和 1)
  2. obj1.say(); 当obj1.调用say时,因为say是obj1的属性,所以say的this也指向obj1,调用say函数时,由于没有传参,所以say中的a,b都为undefined,因为this指向obj1,所以也将obj1中的a,b属性进行了修改。
  3.call方式可以用来暂时修改this指向,第一个参数传指定对象,后面的进行传参,所以此时的this指向obj2,同时将obj2中的a,b属性值也进行了修改。
链接: JavaScript 中 call()、apply()、bind() 的用法,及区别.

5.this指向

看到这里也不容易,出两道简单的题考考你吧!

<script type="text/javascript">function test(){var age = "张三";console.log(this.age);console.log(this);}test();</script>

运行结果:

<script type="text/javascript">var obj = {name:"张三",sayName:function(){console.log(this);console.log(this.name);function show(){console.log(this);}show()}}obj.sayName()//window.obj.sayName();//obj本来就在window中,与上面的结果一样</script>

运行结果:

6.this指向

<script type="text/javascript">var obj = {name:"小明",objInner:{name:"小红",sayName:function(){console.log(this);console.log(this.name);}}}obj.objInner.sayName();</script>

运行结果:

JS this指向练习题相关推荐

  1. 蜗牛学院 第二天 js循环和练习题

    第二天 js循环和练习题 输入:window.prompt("请输入用户名:"); 输出:window.alert("输出的内容"):以弹出框的形式输出. do ...

  2. js this指向问题,同级this指向同级,非同级this指向全局

    重点:this指向问题,同级this指向同级,非同级this指向全局 可以把变量name.obj.s看为同级 obj.name.obj.getName 看为同级 test 单独一级 层级关系 name ...

  3. js this指向分析

    一.普通函数 1.this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁: 实际上this的最终指向的是那个调用它的对象 1 1) function a() { 2 ...

  4. js this指向哪里 JavaScript this指向

    非箭头函数中的this指向一般都是调用者 在非箭头函数中 谁调用了函数,那么函数的this指向就是谁 比如       let obj1 = {         name:'obj1',       ...

  5. krpano中视角js动态指向

    //带有动画滑动 krpano.call("lookto("+ath+","+atv+")"); //没有动画滑动 krpano.call( ...

  6. JS数组常用方法练习题

    1.将 border-left-width 转换成 borderLeftWidth (原创) /* 将 border-left-width 转换成 borderLeftWidth */ functio ...

  7. 几道js数组循环练习题

    //随机弹出一个人的姓名 var nameArr = ["张超","刘圣骞","梁栋","冯旭","赵玉仙&q ...

  8. $.ligerdialog.open中确定按钮加事件_彻底搞懂JavaScript中的this指向问题

    JavaScript中的this是让很多开发者头疼的地方,而this关键字又是一个非常重要的语法点.毫不夸张地说,不理解它的含义,大部分开发任务都无法完成. 想要理解this,你可以先记住以下两点: ...

  9. javascript中 this 指向问题

    前言 this是执行上下文环境的一个属性,而不是某个变量对象的属性. 在全局代码中,this始终是全局对象本身,这样就有可能间接的引用到它了. 在通常的函数调用中,this是由激活上下文代码的调用者来 ...

  10. JavaScript中的 this指向问题

    以下文章均已附上原文链接 ,侵删 文章一:vue中的this指向问题 vue中的this指向问题_JingG459的博客-CSDN博客_vue中this指向问题 最近写项目遇到很多this指向的问题, ...

最新文章

  1. php执行跟踪_PHP使用debug_backtrace方法跟踪调试代码调用详解
  2. blender, 创建多边形面片
  3. jsp的flash小例子
  4. .NET Core 使用 grpc 实现微服务
  5. [python opencv 计算机视觉零基础到实战] 十八、用鼠标进行画画
  6. VALSE学习(十七):VALSE 2019报告总结
  7. 烂泥:学习ssh之ssh隧道应用
  8. 数字电路基础(四) 数据分配器、数据选择器和数值比较器
  9. 【重磅整理】180篇NIPS-2020顶会《强化学习领域》Accept论文大全
  10. 物联网毕业设计 单片机指纹识别考勤系统设计与实现
  11. 23中设计模式之策略模式
  12. bzoj:1922: [Sdoi2010]大陆争霸 (luogu 2446)
  13. 小米手机的sd卡显示无服务器,小米sd卡无法读取_我的小米手机识别不到SD卡,怎么办?...
  14. 我的七条人生哲理以及个人学习方法总结
  15. 金蝶EAS BOS开发固定报表流程
  16. 为何亚马逊的中国电商之路以失败收场?当当网创始人这样说
  17. MySQL OCP888题解030-代理用户技术
  18. Python学习日志08 - 字典
  19. 信息熵、gini、信息增益
  20. 抽奖小工具的设计(2)- python

热门文章

  1. 【Memcached】分布式内存对象缓存系统
  2. 计算机中丢失msvcr100.dll怎么办,msvcr100.dll
  3. Python实现求众数的三种方法
  4. 内核木马:Win32.Rootkit.Rogue.Tzim查杀
  5. 伽罗华域, 二维码和CRC
  6. 2015年动画电影观影指南
  7. 2022蓝桥杯——砍竹子
  8. 2016年腾讯校招笔试题
  9. 使用Spring Validation 完成后端数据校验
  10. 微信测试公众号申请配置