this指针在普通函数、对象方法、定时器、构造函数、事件函数、call()、apply()中的执行
来源:互联网 发布:流星网络电视看不了 编辑:程序博客网 时间:2024/06/05 20:35
前导: this是JavaScript中的一个关键字,在不同的场景中,this指向的对象也不同。在其他面向对象语言中(如C#),this就是指向当前对象。而在JavaScript 中this是在代码运行时绑定的,相对而言this指向比较混乱。在代码运行时this可以指向window对象,也可以指向当前调用对象,还可以指向其他对象。
Javascript调用函数有以下方式:普通函数、对象方法、定时器、构造函数、事件函数、call()/apply(),下面分别分析this在以上函数中的指向
1.this在普通函数中的指向
//1.在普通函数中this指向 var name = "张三"; function demo(){ var name = '李四';//在函数内部定义并声明的变量是局部变量 console.log(this.name); //张三 } demo(); //其实这也可以看做是window.demo(),只不过我们在平常写代码的时候会自动忽略掉。 //所以window是函数的调用者,this指向window,this下name属性的值就是全局变量,所以输出的 //是全局变量 张三,而不是局部变量 李四
2.this在定时器中指向
setInterval(function(){ var a = 12; alert(this.a); },1000) //undefined ,归其本质setInterval方法也属于window,因为window对象下没有a属性,所以 //浏览器会每隔一秒弹出值为undefined的提示框这个案例也很好玩function Demo(){ this.a = 12; setInterval(this.show,1000); } Demo.prototype.show = function(){ alert(this.a); } var demo = new Demo(); demo.show(); //第一次弹出12,之后每隔一秒弹出undefined //原因在this.show代表了Demo.prototype.show的函数体,this指向Demo,所以第一次弹出12; //之后延迟定时器开始工作,定时器时钟到达之后this指向window,window下没有a属性,所以每隔一秒弹出undefined
3. this在对象方法中的指向
name : '张三', sayHi : function(){ alert(this.name); } } var demo = obj.sayHi(); demo();//张三,如果一个对象中的方法有this,那么上一级调用这个方法时,this将指向上一级的对象
4.this在构造函数中的指向
//4.this在构造函数中的指向 function Person(name,age){ this.name = name; this.age = age; function sayHi(){ alert('hello'); } return sayHi; } var per = new Person('张三',14); console.log(per);//new关键字在内存中开辟了新的内存空间,并返回首地址的值,并将this指针指向了这块 //刚开辟的内存空间上,输出结果是person对象。但是如果取消return注释,输出值为sayHi函数体,原因如下: //如果构造函数又返回的值的话,JS引擎会分析返回值的类型,如果返回值类型为Number()、字符串等基本类型, //则不会替代new所创建的对象,如果返回值是引用类型,则将替换new创建出来的对象,因为new创建出来的对象 //也是引用类型,JS引擎无法分辨,将new替换。
5.this在事件函数中的指向
<body> <button id="btn">点击</button></body><script> var btn = document.querySelector('#btn'); btn.onclick = function(){ function fn(){ alert(this); //弹出window,如果事件函数中还有其他函数存在,那么this指向window //如果想要修改this的指向,可以使用一下两种方法 } fn(); }</script>
解决方法:
<body> <button id="btn">点击</button></body><script> var btn = document.querySelector('#btn'); btn.onclick = function(){ var _this = this; //将this指针赋值给一个变量 function fn(){ alert(_this);//指向button对象 } fn(); }</script>
<body> <button id="btn">点击</button></body><script> var btn = document.querySelector('#btn'); btn.onclick = function(){ function fn(){ alert(this);//指向button对象 } fn.call(this);//call()改变this的指向 //call()方法里面需要两大类参数,第一类参数是要修改指针指向的参数,只能有一个参数,并且只能放在第一个位置,第二类参数是函数中需要传参的参数。如果函数不需要传参,则只需要写第一类参数;//apply()同理,但是参数的存放形式不同,参数必须放在[ ]里面 }</script>
阅读全文
1 0
- this指针在普通函数、对象方法、定时器、构造函数、事件函数、call()、apply()中的执行
- Javascript中的this,call,apply,bind函数
- javascript中的this指针、函数、事件、对象
- js学习三、“普通”函数中的this,以及call,apply用法
- 构造函数中的this指针
- javascript 函数中的apply()和call()方法。
- 函数中的this指向,以及 修改this指向的 call/apply/bind方法
- 函数的apply、call方法
- this指针 构造函数
- ECMA5Script中的this对象 ; call、apply方法
- C++构造函数中的this指针
- javascript函数对象的内部方法call(), apply(), bind()
- 关于Js函数对象的apply()和call()方法
- 函数冒充执行之-apply()和call()
- 封装回调函数——为对象方法(Object Method,参数中带this指针的函数) 构造 普通函数(参数中无this指针的函数)形式 的入口
- JavaScript学习--Item8 函数,方法,构造函数调用 标签: javascript构造函数面向对象函数call
- 浅谈js中的call,apply,bind方法中的this指针
- call与apply函数
- 29.Case class 和Case object代码实战解析
- 三分
- 【机器学习笔记】SVM part1: 线性SVM
- PAT 甲级 1023. Have Fun with Numbers
- mysql面试--索引原理
- this指针在普通函数、对象方法、定时器、构造函数、事件函数、call()、apply()中的执行
- HDU6138
- 使用qemu-monitor 从host直接连接vm
- 高可用设计之逻辑层
- ognl.MethodFailedException: Method "setId" failed for object Itemer/org.springframework.orm.hibernat
- shift 空格 || shift+空格 || shift space || shift+space
- 一行代码嵌入视频互动系统,用于视频会议或网上教学。
- 开启Makefile大门
- setStrokeWidth的坑