刚接触js不久时对this总是感到无比迷茫,以下是来自js设计模式与实践里的总结

this总是指向一个对象,有时指向全局对象,有时指向构造对象,有时指向DOM对象

1. 作为对象的方法调用

做为对象的方法调用时 this 指向对象本生

var Person = {
name: 'bingxl',
getName: function () {
console.log(this.name); //bingxl
}
};
Person.getName();

2. 作为普通函数被调用

普通函数里的this总是指向全局变量

var name = 'window';
function getName() {
var name = 'function';
return this.name;
} console.log( getName()); //window 严格模式下为undefined

对象的方法复制给变量,在通过变量来调用后对象的方法变成了普通函数

var name = 'window';
var Person = {
name: 'bingxl',
getName: function () {
return this.name;
}
};
var getName1 = Person.getName;
console.log(getName1()); // window
var getName2 = Person.getName();
console.log(getName2); // bingxl

自习观看这个例子发现:

getName1 = Person.getName 是把getName1指向Person.getName方法的内存地址(方法本身没有被执行),其本质是个函数,所以在使用getName1() 时就是调用普通函数

getName2 = Person.getName() 是把Person.getName的返回值(已经执行了)bingxl赋值给getName2

对两个变量经行typeof操作

console.log(typeof getName1);  //function
console.log(typeof getName2);// string

3. DOM事件触发函数里的this

DOM事件触发函数里的this指向DOM节点本身

<!DOCHTML html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<div id='person'>click this</div>
<script>
window.id = 'window';
var div = document.getElementById('person');
div.addEventListener('click', function () {
console.log(this.id); //person
var test = function () {
console.log(this.id); // window
};
test();
});
</script>
</body>
</html>

test() 是一个普通函数,所以test里的this指向了全局对象window

4. 构造器调用

使用new运算符调用构造函数时会返回一个对象,构造函数里的this一般就指向返回的对象

当构造函数使用return显式的返回一个对象时new操作符返回的就是显式返回的对象

var Person = function () {
this.name = 'bingxl';
};
var student = new Person();
console.log(student.name); // bingxl
var Person = function () {
this.name = 'bingxl';
return {
name: 'test'
};
};
var student = new Person();
console.log(student.name); // test

5. call 与 apply

通过call 或apply调用会改变this的指向


var Doctor = {
name: 'bingxl',
profession: 'doctor',
getProfession: function () {
console.log(this.profession);
}
}; var Student = {
name: 'zhangsan',
profession: 'student'
};
Doctor.getProfession(); // doctor
Doctor.getProfession.call(Student); //student

end

javascript中的this使用场景的更多相关文章

  1. javascript 中this的使用场景全

    1. global this 2.function this 3.prototype this 4. object this 5.DOM this 6 HTML this 7 override thi ...

  2. JavaScript中“&&”和“||”操作符的意义,深入理解和使用场景

     一.概念 与其他语言不同,在js中,逻辑运算符可以返回任何类型的数据,不仅仅是true和false. &&和||的返回值是两个操作数的其中一个.即a&&b或者a||b ...

  3. C#保留2位小数几种场景总结 游标遍历所有数据库循环执行修改数据库的sql命令 原生js轮盘抽奖实例分析(幸运大转盘抽奖) javascript中的typeof和类型判断

    C#保留2位小数几种场景总结   场景1: C#保留2位小数,.ToString("f2")确实可以,但是如果这个数字本来就小数点后面三位比如1.253,那么转化之后就会变成1.2 ...

  4. javascript中的this在不同场景下的区别

    javascript在初版的设计上存在失误,导致了这门语言在使用时,经验型写法并不能得到像其它几个流行语言一样预期.其中的this的使用就是一个典型. this在javascript中是由解释器注入的 ...

  5. JavaScript 中的数据类型

    Javascript中的数据类型有以下几种情况: 基本类型:string,number,boolean 特殊类型:undefined,null 引用类型:Object,Function,Date,Ar ...

  6. javascript中的操作符详解1

    好久没有写点什么了,根据博主的技术,仍然写一点javascript新手入门文章,接下来我们一起来探讨javascript的操作符. 一.前言 javascript中有许多操作符,但是许多初学者并不理解 ...

  7. 详解Javascript中正则表达式的使用

    正则表达式用来处理字符串特别好用,在JavaScript中能用到正则表达式的地方有很多,本文对正则表达式基础知识和Javascript中正则表达式的使用做一个总结. 第一部分简单列举了正则表达式在Ja ...

  8. javascript中的感叹号 "!"

    JavaScript中会经常遇到一个操作符:! 这是一个布尔操作符,用于将操作的值强制转换为布尔值并取反.常用场景如下: //条件判断中使用 var a; var b=null; if(!a){ co ...

  9. javascript中函数的3个高级技巧

    × 目录 [1]作用域安全 [2]惰性载入 [3]函数绑定 前面的话 函数对任何一门语言来说都是一个核心的概念,在javascript中更是如此.前面曾以深入理解函数系列的形式介绍了函数的相关内容,本 ...

随机推荐

  1. JS中setTimeout()的用法详解

    1. SetTimeOut() 1.1 SetTimeOut()语法例子 1.2 用SetTimeOut()执行Function 1.3 SetTimeOut()语法例子 1.4 设定条件使SetTi ...

  2. Exception in thread "main" brut.androlib.err.UndefinedResObject: resource spec: 0x01030200

    Exception in thread "main" brut.androlib.err.UndefinedResObject: resource spec: 0x01030200 ...

  3. Total Commander的初次体验

    从汉化新世纪下载到最新的TC张学思版后,运行文件只需依照其提示就可以完成该软件的安装.作为新手初次运行体验了以下功能: 一.目录跳转 1. 初次启动TC软件界面截图: 2. 按下Ctrl+d后,直接再 ...

  4. 利用Angular2的Observables实现交互控制

    在Angular1.x中,我们使用Promise来处理各种异步.但是在angular2中,使用的是Reactive Extensions (Rx)的Observable.对于Promise和Obser ...

  5. vagrant 使用

    1. 下载官方的 box 文件. 官方box列表 2. 在本地创建一个目录.如: D:\test\ 3. 运行 cmd 命令,并进入 d:\test 目录 4. 添加前面下载的 box. 添加 box ...

  6. 高级工程师->架构师

    1. 分解等级 技术人员典型的发展路径基本上都是下面的这个模式: 1) 0 ~1年:菜鸟,需要别人手把手来教 2)1 ~ 3年:初级,需要别人带你做 3)3 ~ 5年:高级,能独当一面,可以带初级技术 ...

  7. VB6加载MSCOMCTL.OCX出现“不能加载''”错误的处理方法汇总

    自从我安装卸载几次OFFICE和WPS后,VB6就出现了这样的问题. 然后在网上收集各种解决办法: 1.第一种:工程文件引用可能有问题,跟本机的相关组件版本不一致. 用记事本打开VBP文件找到这一行: ...

  8. anularjs前端分页

    var dataList = []; $scope.page = { page:1, pageSize:15, numPerPageOpt:[15,30,50,100], totalNum:0, to ...

  9. P1891 疯狂LCM

    \(\color{#0066ff}{ 题目描述 }\) 众所周知,czmppppp是数学大神犇.一天,他给众蒟蒻们出了一道数论题,蒟蒻们都惊呆了... 给定正整数N,求LCM(1,N)+LCM(2,N ...

  10. Linq中DeferredLoadingEnabled,DataLoadOption的用法

    1.  基本的数据关系图 Student和Class之间是多对一关系,Student和Course之间是多对多关系. DataContext的DeferredLoadingEnabled属性指定是否需 ...