如何区分JS中的this?!
->我们一般只研究函数执行的时候里面的this
->this是谁和当前的函数在哪执行和在哪定义没有半毛钱的关系
1)看函数执行的时候,函数名之前是否有".",有的话"."前面是谁this就是谁,没有的话this就是window
oDiv.onclick=function(){
//匿名函数中的this->oDiv
fn();//fn函数中的this->window
};
[].slice(0);//->slice中的this是[]
[].__proto__.slice(0);//->slice中的this是Array.prototype
-->我们自己在数组原型中编写的方法,一般情况下我们函数中的this就是当前我们要操作的这个元素
Array.prototype.distinct=function(){
//this->我们当前要操作的这个数组
};
[1,2,2,3,1,2,3,2,1].distinct();
2)自执行函数中的this永远是window
(function(){ //this->window })();
~function(){ //this->window }();
window.setTimeout(function(){
//this->window
},10);
ary.sort(function(a,b){
//第一个匿名函数(参数)在执行的时候里面的 this->window
});
ary.forEach(function(){
//第一个匿名函数(参数)在执行的时候里面的 this->window
//但是如果context传递了值(第二个参数传递值了)那么这个方法中的this就是context
},context);
str.replace(reg,function(){
//this->window
});
3)给元素的某一个事件绑定方法,当事件触发的时候,方法中的this是当前元素本身
[DOM零级事件绑定]
oDiv.onclick=function(){
//this->oDiv
};
[DOM二级事件绑定]
oDiv.addEventListener("click",function(){
//this->oDiv
},false);
//在IE6~8下使用attachEvent
oDiv.attachEvent("click",function(){
//this->window
});
4)在构造函数模式中,我们的this.xxx=xxx中的this是当前的类的一个实例
function Fn(){
this.x=100;//this->f x是给当前实例f增加的私有的属性
}
Fn.prototype.getX=function(){
console.log(this.x);
};
var f=new Fn;
f.getX();//getX中的this->f
f.__proto__.getX();//getX中的this->Fn.prototype
5)call和apply强制改变this的指向->以上所有的this情况在遇到call/apply的时候都不好使,都已强制改变的为主
obj.fn.call(1);//this->1
一般情况下,我们执行call方法第一个传递的参数值是谁,那么fn中的this就是谁
[在非严格模式下]
第一个参数没有传递值、传递的是null、传递的是undefined fn中的this都是window
[严格模式下]
第一个参数传递的是谁this就是谁,传递null/undefined,fn中的this都是对应的null/undefined,不传递值默认也是undefined
转载请标明出处
来自 珠峰培训
如何区分JS中的this?!的更多相关文章
- 区分js中的null,undefined,"",0和false
console.log(typeof null);//object console.log(typeof undefined);//undefined console.log(typeof " ...
- 区分JS中的undefined,null,"",0和false
在程序语言中定义的各种各样的数据类型中,我们都会为其定义一个"空值"或"假值",比如对象类型的空值null,.NET Framework中数据库 字段的空值DB ...
- JS中区分参数方法
实现功能:在使用cocosjs制作游戏过程中,很多东西都可以重复使用,例如菜单栏等等.今天尝试写了一个自定义的Js文件用作菜单方便以后使用. 将菜单按钮,以及触发事件作为参数生成一个层 直接在游戏中使 ...
- 在js中如何区分深拷贝与浅拷贝?
一.自我理解 简单来讲就是:深拷贝层层拷贝,浅拷贝只拷贝第一层. 在深拷贝中,新对象中的更改不会影响原对象,而在浅拷贝中,新对象中的更改,原对象中也会跟着改. 在深拷贝中,原对象与新对象不共享相同的属 ...
- JS中script词法分析
核心:JS中的script是分段执行的. <script> var i = 10; </script> <script> alert(i); </script ...
- JS 中没有按地址(引用)传递,只有按值传递
很多人,包括我,受书本知识消化不彻底的影响,认为 JS 中参数有两种传递方式:数字.字符串等按值传递:数组.对象等按地址(引用)传递.对此种观点,我们要谨慎. var v1 = [] var v2 = ...
- JS中的常量(基本数据类型)和内置对象
JS中的基本数据类型: String .number.null.boolean.undefined.object.symbol(ES6) 1. 利用typeof运算符时其中只有null是异常的,ty ...
- js中NAN、NULL、undefined的区别
NaN:保留字(表明数据类型不是数字) undefined:对象属性或方法不存在,或声明了变量但从未赋值.即当你使用了对象未定的属性或者未定义的方法时或当你声明一个变量,但你确从未对其进行赋值,便对其 ...
- prototype.js 和 jQuery.js中 ajax 的使用
这次还是prototype.js 和 jQuery.js冲突的问题,前面说到过解决办法http://www.cnblogs.com/Joanna-Yan/p/4836252.html,以及上网说的大部 ...
随机推荐
- function gzdecode
function gzdecode($data) { return gzinflate(substr($data,10,-8)); } 因为项目要下载一个gzip压缩的网页,所以需要解压,手册上有一个 ...
- python登陆,注册小程序
def login(username,password): ''' 用于用户登录 :param username: 用户输入用户名 :param password: 用户输入密码 :return: T ...
- validator
http://rickharrison.github.io/validate.js/validate.js rules: 'required|callback_check_password' vali ...
- 根据图片Uri获得图片文件
2013-12-17 1. 根据联系人图片Uri获得图片文件并将它显示在ImageView上, 代码如下: Uri uri = Uri.parse("content://com.androi ...
- [开发笔记]-WindowsService服务程序开发
Windows服务:Microsoft Windows 服务(即,以前的 NT服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时自动启动,可 ...
- superobject中 JavaToDelphiDateTime的使用
procedure TForm1.FormCreate(Sender: TObject); var n: TDateTime; i64: Int64; s: Integer; begin Memo1. ...
- java枚举类
enum关键字用于定义枚举类,若枚举只有一个成员, 则可以作为一种单例模式的实现方式. 枚举类对象的属性不应允许被改动, 所以应该使用 private final 修饰. 枚举类的使用 priva ...
- 利用K2和Microsoft Dynamics CRM构建业务App的5大理由
Microsoft Dynamics CRM提供了一个绝佳的客户关系管理平台,使您能够创建各种以客户为中心的解决方案.然而,通过将K2的企业业务流程功能与Microsoft Dynamics CRM相 ...
- 记录一些容易忘记的属性 -- UILabel
一:UILabel lbl.alpha=0.f; lbl 透明,会影响子视图的显示 lbl.backgroundColor=[UIColor clearColor]; lbl 背景色透明,子视图 ...
- Image Generator (Image Builder)
如果你想要下载一个预编译好的镜像文件,或者想要尝试整个编译过程,一个替代方案是使用镜像生成器(Image Generator)(以前被叫做Image Builder).这是一个预编译好的OpenWrt ...