this 机制的四种规则
江湖人称,谁调用 this,this 就指向谁。
那么 this 到底绑定或者引用的是哪个对象环境呢,以下便是四种规则
1. 默认绑定全局变量
function fn() {
console.log(this.a);
}
var a = 2;
fn(); // 2 | this 为默认的 window
2. 隐式绑定
function fn() {
console.log(this.a);
}
var obj = {
a: 2,
obj2: obj2,
}
var obj2 = {
a: 42,
fn: fn,
}
obj.obj2.fn(); // 42 | this 引用上下文对象
但,特别注意一点,对象的存储问题,变量只是它的指针而已,而赋值改变的是数据
function fn() {
console.log(this.a);
}
var obj = {
a: 2,
fn: fn,
}
var fn2 = obj.fn;
fn2(); // undefined | this 此时是 window
3. 显式绑定
function fn() {
console.log(this.a);
}
var obj = {
a: 2,
}
fn.call(obj); // 2 | 将上下文赋给 fn
4. new 对象绑定
function Fn(a) {
this.a = a;
}
var obj = new Fn(2);
console.log(obj.a); // 2 | this 绑定在 Fn 上
关于 this 的难点和误区主要有两方面,this 的引用者,与,this 的作用域
function fn(i) {
console.log('fn:', i); // 2
this.count++; // 此处的 this 指向 window,而不是下面的 fn.count
}
fn.count = 0;
for(var i=0; i<3; i++) {
if (i>1) fn(i);
}
console.log(fn.count); // 0 | fn.count 和 fn 没有半毛钱关系
console.log(count); // NaN | 首先 window.count 为 undefined,所以再加就是 NaN
function fn1() {
var a = 2;
this.fn2();
}
function fn2() {
console.log(this.a); // undefined
// 此时的 this 依然指向 window,而不是由 fn1 传递上下文
}
fn1();
this 机制的四种规则的更多相关文章
- sentinel的四种流控规则介绍
sentinel的四种流控规则介绍 今天的内容我们主要围绕四个点进行展开介绍. 流控模式 :关联.链路 流控效果 :Warm Up.排队等待 这四点具体是什么意思呢? 首先启动项目:cloud-ali ...
- Mysql 四种事务隔离介绍以及锁机制
还有很多不太懂,这里收集几份大佬文章“飞机票”,待我整理好了,再好好写一篇文章吧. MySQL的四种事务隔离级别 https://www.cnblogs.com/huanongying/p/70215 ...
- IOS研究之IOS7四种后台机制
IOS 7中,实际上APP拥有四种后台模式.不管是哪一种后台机制,均须要利用苹果给予的对应后台接口实现.IOS7系统中,开发人员能够灵活利用多种后台接口(API)实现更加智能的应用操作. 对获取 ...
- this的四种绑定规则总结
一.默认绑定 1.全局环境中,this默认绑定到window 2.函数独立调用时,this默认绑定到window console.log(this === window);//true functio ...
- c++ 四种类型转换机制
类型转换机制可以分为:隐式类型转换 和 显示类型转换(强制类型转换) C中的类型转换: 事情要从头说起,这个头就是C语言.我们已经习惯了使用C-like类型转换,因为它强大而且简单. 主要有一下两种形 ...
- Java ExecutorService四种线程池及自定义ThreadPoolExecutor机制
一.Java 线程池 Java通过Executors提供四种线程池,分别为:1.newCachedThreadPool:创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收 ...
- 【转】转帖并注释:Java中的事件处理机制--事件监听器的四种实现方式
原文地址:http://blog.sina.com.cn/s/blog_4b650d650100nqws.html Java中四种事件监听器的实现方式分别为: 自身类做为事件监听器 外部类作为事件监听 ...
- CSS 四种样式表 六种规则选择器 五种常用样式属性
新的html程序要在VS中编写了,在vs中安装ASP.NET和Web开发,并用ASP.NET Web 应用程序(.NETFramework)创建一个网页程序.添加一个html页 后面的代码都是在htm ...
- Java中四种引用:强、软、弱、虚引用
这篇文章非常棒:http://alinazh.blog.51cto.com/5459270/1276173 Java中四种引用:强.软.弱.虚引用 1.1.强引用当我们使用new 这个关键字创建对象时 ...
随机推荐
- 2017 Wuhan University Programming Contest (Online Round) C. Divide by Six 分析+模拟
/** 题目:C. Divide by Six 链接:https://oj.ejq.me/problem/24 题意:给定一个数,这个数位数达到1e5,可能存在前导0.问为了使这个数是6的倍数,且没有 ...
- python升级导致yum命令无法使用的解决
1.报错信息如下: [root@develop bin]# yum [root@develop local]# yum -y install prce There was a problem impo ...
- php 防止刷新重复下载文件
在超链接中增加随机数. <a href="./index.php?module=operation&action=download&url=D:\WW\WlequPho ...
- Android实现录屏直播(二)需求才是硬道理之产品功能调研
请尊重分享成果,转载请注明出处,本文来自Coder包子哥,原文链接:http://blog.csdn.net/zxccxzzxz/article/details/54254244 前面的Android ...
- jsp中怎么隐藏from表 和一些按钮?
给你提供两种方法:1.style.display="none"2.添加margen-left属性,值赋为负数,页面上有,但是不会显示
- Tomcat (7.0)数据源配置
在Tomcat这个Java Web容器下通过配置DataSource(数据源)对象能够解决上面所述的问题. JDBC中的javx.sql.DataSource接口负责建立于数据库的连接.程序中直接从数 ...
- 涉及spring的相关概念
1.pojo 2.为了降低java开发的复杂性,spring采用了4中策略 (1).基于POJO的轻量级和最小侵入性编程 (2).通过依赖注入和接口编程实现松耦合 (3).基于切面和惯例进行声明式编程 ...
- iOS-ASIHTTPRequest框架学习
本文转载至 http://www.cnblogs.com/A-Long-Way-Chris/p/3539679.html 前段时间在公司的产品中支持了够快网盘,用于云盘存储. 在这个过程中,学习到了很 ...
- delphi局域网Ping各主机方法及设置本地ip方法
1. 首先引用winsock单元 function PingHost(HostIP: String): Boolean; type PIPOptionInformation=^TIPOptionInf ...
- 【转】图解MySql命令行创建存储过程
一 操作实例 首先登录mysql: 使用source命令,从命令行执行sql脚本,创建表: 创建第一个存储过程: 事先用DELIMITER关键字申明当前段分隔符,这样MySQL才会将";&q ...