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 这个关键字创建对象时 ...
随机推荐
- python 函数 参数 (难点传入dict list)
--使用参数组可以传值列表,字典:格式 #-*-coding:utf-8-*- def func5(x,*s,**gs): print(x) print(s) print(gs) print '*'* ...
- 读汤姆大叔《深入理解javascript系列》笔记一编写高质量代码
感觉大叔的博文真的是很不错 我打算严格要求自己 按照大叔说的,这样我就会更有规范,更有思想的去工作 去写代码(一入代码深似海) 1,尽可能的少用全局变量(污染全局空间,也会和别人的代码 发生冲突造 ...
- sqlserver tips
方括号内的表示一个对象名(视图,存储过程,表 等).列名:正常使用时,加不加一样,但是如果对象名是保留字的话,比如cascade,就必须加:不过建议不用保留字作为对象名 if object_id('[ ...
- ios -bitmap上下文生成图片 生成水印
- (void)test { // 0. 加载背景图片 UIImage *image = [UIImage imageNamed:@"psb"]; // 1.创建bitmap上下文 ...
- MySQL的order by子句
1.语法:select 字段列表 from 表名 [where 子句][group by 子句][having 子句][order by 子句]; 注解: 1.默认是从第一条记录开始升序, 2.des ...
- 【BZOJ2242】[SDOI2011]计算器 BSGS
[BZOJ2242][SDOI2011]计算器 Description 你被要求设计一个计算器完成以下三项任务: 1.给定y,z,p,计算Y^Z Mod P 的值: 2.给定y,z,p,计算满足xy≡ ...
- java 序列化的作用
public class Test { public static String requestUrl = "http://localhost/SpringMvc/test.do" ...
- Linux 装JDK
1.查看当前系统有没有装jdk java -version 2.看看有没有安装包 rpm -qa | grep java 3.卸载OpenJDK $>rpm -e --nodeps tzdata ...
- IOS 代码块
1.关系式表示 <returnType>(^BlockName)(list of arguments)=^(arguments){body;};
- fatal error C1083: 无法打开包括文件:“stdint.h”: No such file or directory
stdint.h是c99标准的头文件,vc不支持,所以肯定会提示“No such file or directory”的. stdint.h是C99的标准,主要用于统一跨平台数据定义. MSVC中不带 ...