JS的this指向深入
this指向深入
this的绑定规则
- 默认绑定
 - this默认指向了window
 
- 全局环境下this指向了window
 - 函数独立调用,函数内部的this也指向了window
 
<script>
function fn(){
	console.log(this);
}
fn();
</script>
- 函数被嵌套的函数独立调用时,this默认指向了window
 - 函数当做对象的方法来调用时,this指向了obj
 
<script>
var obj = {
	a:2,
	foo:function(){
		var that = this;
		function test(){
			console.log(that.a);
		}
		test();
	}
}
obj.foo();
</script>
- 自执行函数内容this也指向了window
 
<script>
var a = 10;
function foo(){
	(function(){console.log(this.a);}());
}
var obj = {
	a:2,
	foo:foo
}
obj.foo();
</script>
- 闭包this默认指向window
 
<script>
var a = 0;
var obj = {
	a:2,
	foo:function(){
		var c = this.a;
		return function test(){
			console.log(this);
			return c;
		}
	}
}
var fn = obj.foo();
console.log(fn);
</script>
隐式绑定
<script>
function foo(){
	console.log(this.a);
}
var obj = {
	a:1,
	foo:foo
}
//foo()函数的直接对象是obj,this的指向直接对象。
obj.foo();
</script>
隐式丢失
隐式丢失是指被隐式绑定的函数丢失了绑定对象 从而默认绑定到window
这种情况比较容易出错却非常常见。
<script>
var a = 0;
function foo(){
	console.log(this.a);
}
var obj = {
	a:1,
	foo:foo
	var bar = obj.foo();
	bar();
</script>
把obj.foo()赋值给别名bar,造成隐式丢失的情况,因为只有把obj.foo()赋值了bar变量
而bar与obj对象毫无关系。
new绑定
如果是new关键字来执行函数,相当于构造函数来实例化对象,name内部的this指向了当前实例化的对象
<script>
function fn(){
	console.log(this);
}
var fn = new fn();
console.log(fn);
</script>
使用return关键字来返回对象的时候,this还是指向了当前的对象。
<script>
function fn2(){
	console.log(this);
	return {
		name:'xxx'
	}
}
var fn2 = new fn2();
console.log(fn2);
</script>
严格模式下的this
严格模式下,独立调用的函数内部的this指向了undefined
<script>
function fn(){
	'use strict';
	console.log(this);
}
fn();
//函数apply()和call()
//严格模式下,函数apply()和call()内部的this始终是它们的第一个参数。
var color = 'red';
function showColor(){
	'use strict';
	console.log(this);
	console.log(this.color);
}
showColor.call(undefined);
</script>
this总结
- 默认绑定
 - 隐式绑定
 - 显示绑定
 - new绑定
分别对应了函数的四种调用方式,
四种调用方式对应了this绑定
调用方式 - 独立调用
 - 方法调用
 - 间接调用
 - 构造方法调用
 
- 独立调用 对应 默认绑定
 - 方法调用this指向obj
 - 间接调用通过call()、apply()、bind() 来更改内部的this指向。
 - 构造函数在函数中添加了new关键字,内部中的this会发生改变,它会改变当前的实例化对象。
 
JS的this指向深入的更多相关文章
- JavaScript面向对象(一)——JS OOP基础与JS 中This指向详解
		
前 言 JRedu 学过程序语言的都知道,我们的程序语言进化是从"面向机器".到"面向过程".再到"面向对象"一步步的发展而来.类似于 ...
 - 关于js中this指向的理解总结!
		
关于js中this指向的理解! this是什么?定义:this是包含它的函数作为方法被调用时所属的对象. 首先,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁 ...
 - Atitit.js this错误指向window的解决方案
		
Atitit.js this错误指向window的解决方案 1.1. 出现地点and解决之道1 1.2. call,apply和bind这三个方法2 1.2.1. Function.prototype ...
 - 前端js中this指向及改变this指向的方法
		
js中this指向是一个难点,花了很长时间来整理和学习相关的知识点. 一. this this是JS中的关键字, 它始终指向了一个对象, this是一个指针; 参考博文: JavaScript函数中的 ...
 - js中this指向的三种情况
		
js中this指向的几种情况一.全局作用域或者普通函数自执行中this指向全局对象window,普通函数的自执行会进行预编译,然后预编译this的指向是window //全局作用域 console.l ...
 - JS中this指向的更改
		
JS中this指向的更改 JavaScript 中 this 的指向问题 前面已经总结过,但在实际开中, 很多场景都需要改变 this 的指向. 现在我们讨论更改 this 指向的问题. call更改 ...
 - 关于js中this指向的总结
		
js中this指向问题一直是个坑,之前一直是懵懵懂懂的,大概知道一点,但一直不知道各种情况下指向有什么区别,今天亲自动手测试了下this的指向. 1.在对象中的this对象中的this指向我们创建的对 ...
 - 面试官问:JS的this指向
		
前言 面试官出很多考题,基本都会变着方式来考察this指向,看候选人对JS基础知识是否扎实.读者可以先拉到底部看总结,再谷歌(或各技术平台)搜索几篇类似文章,看笔者写的文章和别人有什么不同(欢迎在评论 ...
 - 深入理解JS各种this指向问题
		
说到this,入前端坑的人都知道这是JS初期语言毕竟之路.很多人(我就是)对于this的了解很模糊,或者不够全面.最近打算在反过来在看下es6,在es6中又出现了箭头函数对于this的理解有多了层认识 ...
 - javascript函数,构造函数。js对象和json的区别。js中this指向问题
		
函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块.好处:在出现大量程序相同的时候,可以封装为一个function,这样只用调用一次,就能执行很多语句.(1)语法:函数就是包裹在花括号中的代码 ...
 
随机推荐
- Hexo准备---Node.js、Vue
			
Hexo准备---Node.js.Vue 安装node.js 1.下载node 配置node.js环境官网下载,一直next就好,非常方便. 下载官网: http://nodejs.cn/downlo ...
 - Python import本地模块
			
无法识别本地模块 在pycharm中选择文件夹Mark Directory as -> Source root. 或者使用sys.path.append()添加文件夹路径 还是报错ImportE ...
 - 关于FFT的一些理解,以及如何手工计算FFT加深理解和验证正确性
			
总结缺少逻辑性和系统性,主要便于自己理解和记忆 关于一维FFT的 于是复系数Cn是图像傅里叶变换的yn列向量 于是我们看到最后引入,Cn这个复系数的模来表征频率波的振幅记为Sn(即简谐波叠加的数量 然 ...
 - HDU 6155 Subsequence Count(矩阵 + DP + 线段树)题解
			
题意:01串,操作1:把l r区间的0变1,1变0:操作2:求出l r区间的子序列种数 思路:设DP[i][j]为到i为止以j结尾的种数,假设j为0,那么dp[i][0] = dp[i - 1][1] ...
 - bzoj1013球形空间产生器sphere 高斯消元(有系统差的写法
			
Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁 ...
 - js GC & stack heap
			
js GC & stack heap stack 栈,函数执行形成执行栈帧,变量名,指针 heap 堆,非结构化的数据(Object),分配的内存的存储空间 js 垃圾回收机制 https:/ ...
 - alipay 小程序开发教程
			
alipay 小程序开发教程 https://opendocs.alipay.com/mini/00ccmd 或访问开放平台:https://opendocs.alipay.com/mini/00cc ...
 - shit 钉钉
			
shit 钉钉 钉钉 圈子 入口, 没有 https://www.dingtalk.com/qidian/help-detail-1000131196.html shit bug 全员圈 这个好像是要 ...
 - windows10 安装NASM
			
NASM官网 下载NASM NASM在线HTML文档 下载golink golink文档 NASM教程 in windows x64调用约定 x86调用约定 编码样式约定 在编写nasm时数字默认为1 ...
 - iOS 兼容性处理
			
1. scroll滑动层,在iOS中滑动不流畅的处理 -webkit-overflow-scrolling:touch; //在滑动层标签添加这个样式 2. iOS 系统中input标签,去掉圆角效果 ...