javascript--this机制
this在javascript中很常见同时也是种比较复杂的机制,正确地了解this并且学会正确使用,可以让我们写出更高效、优雅的代码。
this是在代码运行时进行绑定的,并不在编写时,它的上下文环境取决于韩式调用时的各种条件。this的绑定和函数声明的位置没有任何的关系,只取决于函数的调用方式。
this的四种绑定规则
1、默认绑定
function foo(){console.log(this.a); }var a = 2;foo(); //2
调用foo()时,内部的this会指向全局对象,应用了this的默认绑定
但是,如果实在严格模式下的话,this就是指向了undefined了
2、隐式绑定
function foo(){console.log(this.a); }var obj = {a : '3',foo : foo }obj.foo(); //3
声明对象obj,属性foo是引用了函数foo,当obj.foo()调用时,隐式绑定规则会把函数调用的this绑定到这个obj上下文对象
3、显式绑定
function foo(){console.log(this.a); }var obj2 = {a : 4}foo.call(obj2); //4
通过foo.call()可以在调用foo时强制把它的this绑定到obj上
4、new绑定
function baz(a){this.a = a
}
var bar = new baz(5);
console.log(bar.a);
使用new关键字调用函数会发生什么操作在上篇博文也有介绍到,构造出一个新对象并把它绑定到baz调用中的this上
判断this规则
我们可以按照以下的规则来判断this是应用了哪个规则:
1、函数是否在new中调用?是的话this绑定的是新创建对象
var bar = new foo();
2、函数是否通过call、apply显式绑定?是的话this绑定了指定对象
foo.call(obj);
3、函数是否在某个上下文调用隐式绑定,是的话this绑定那个上下文对象
obj.foo()
4、如果都不是的话,this则应用了默认绑定
绑定例外
当我们把null和undefined作为this的绑定对象传入call、apply时,这些值会被忽略,实际上是应用了默认绑定
function foo(){console.log(this.a); }var a = 2;foo.call(null); //2
如果文中有出现错误的地方,欢迎大家指正
转载于:https://www.cnblogs.com/weapon-x/p/5335125.html
javascript--this机制相关推荐
- 傻傻分不清的javascript运行机制
学习到javascript的运行机制时,有几个概念经常出现在各种文章中且容易混淆.Execution Context(执行环境或执行上下文),Context Stack (执行栈),Variable ...
- 【探讨】javascript事件机制底层实现原理
前言 又到了扯淡时间了,我最近在思考javascript事件机制底层的实现,但是暂时没有勇气去看chrome源码,所以今天我来猜测一把 我们今天来猜一猜,探讨探讨,javascript底层事件机制是如 ...
- 深入理解JavaScript定时机制
容易欺骗别人感情的JavaScript定时器 本文地址: http://www.laruence.com/2009/09/23/1089.html 转载文章 JavaScript的setTimeout ...
- 前端知识点回顾之重点篇——JavaScript异步机制
JavaScript异步机制 来源:https://www.cnblogs.com/zhaodongyu/p/3922961.html JavaScript是单线程异步执行的,单线程意味着代码在任务队 ...
- Javascript继承机制的设计思想
我一直很难理解Javascript语言的继承机制. 它没有"子类"和"父类"的概念,也没有"类"(class)和"实例" ...
- JavaScript可否多线程? 深入理解JavaScript定时机制
JavaScript的setTimeout与setInterval是两个很容易欺骗别人感情的方法,因为我们开始常常以为调用了就会按既定的方式执行, 我想不少人都深有同感, 例如 setTimeout( ...
- 写给Java开发者看的JavaScript对象机制
帮助面向对象开发者理解关于JavaScript对象机制 本文是以一个熟悉OO语言的开发者视角,来解释JavaScript中的对象. 对于不了解JavaScript 语言,尤其是习惯了OO语言的开发者来 ...
- JavaScript 运行机制详解(理解同步、异步和事件循环)
1.为什么JavaScript是单线程? JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事.那么,为什么JavaScript不能有多个线程呢?这样能提高效率啊. Java ...
- javascript事件机制与jQuery.bind的补充说明
在之前的文章javascript 事件机制 与 jQuery.Bind中,为了说明冒泡阶段中Event Handler Function的表现,我使用了event.data来记录触发function的 ...
- javascript解析机制——预解析
JavaScript解析机制是什么? JavaScript解析过程分为两个阶段,一个是编译阶段,另外一个就是执行阶段. * 编译阶段 编译阶段就是我们常说的JavaScript预解析( ...
最新文章
- 19.Remove Nth Node From End of List
- Java NIO系列教程(十二) Java NIO与IO
- PHP-FPM进程数的设定
- 算法复习——计算几何基础(zoj1081)
- 为什么MySQL数据库要用B+树存储索引
- 2020年十大消费新机遇
- 小白初涉,先试试水。涉及Python,C语言基础,机器学习等
- 计算机上安装了更新ie版本,电脑ie浏览器版本过低怎么升级方法
- Redis源码分析之内存检测memtest
- 【工作日报】2019年7月 前端开发工作日报汇总
- n维随机变量的分布函数和独立性
- L1-009 N个数求和 (20 分)(C语言)(测试点3和测试点5)
- Qt-利用fmod库显示声音波形
- 乐视X625手机刷机(全三个版本)官方包附刷机教程OEM解锁
- 数据分析初回-探索性数据分析
- 网络断了,咫尺还是咫尺,天涯还是天涯
- 社区版PyCharm安装Django(中文版)
- python中的matplotlib怎么改变标题大小和图例的字体大小和线的线型与颜色和输出图片大小呢?
- 基于MATLAB的全工况前向碰撞预警模型学习
- 3D模型学会了「唱、跳、Rap、篮球」,程序员们全沉迷「鸡你太美」
热门文章
- 脚本中调用别的脚本,如何得到执行结果?
- 错误解决办法:2006:MySQL server has gone away
- qt中的信号都需要emit触发吗_[Vue笔记] $emit 与 $event
- 为什么root下不能使用passwd命令_Linux:CentOS 7中常用的基础命令
- android调用系统相机进行拍照,android调用系统相机拍照
- 主题背景_游戏背景音乐的种类—主题曲
- 阿里云服务器无法远程连接mysql数据库_关于远程连接MySQL数据库的问题解决
- 深入解读Linux与Android的相互关系 Android消息处理系统的原理
- SQL中使用WITH AS提高性能-使用公用表表达式(CTE)简化嵌套SQL(转载)
- zabbix 3.0 的web界面出现乱码如何解决?