this指向深入

this的绑定规则

  • 默认绑定
  • this默认指向了window
  1. 全局环境下this指向了window
  2. 函数独立调用,函数内部的this也指向了window
<script>
function fn(){
console.log(this);
}
fn();
</script>
  1. 函数被嵌套的函数独立调用时,this默认指向了window
  2. 函数当做对象的方法来调用时,this指向了obj
<script>
var obj = {
a:2,
foo:function(){
var that = this;
function test(){
console.log(that.a);
}
test();
}
}
obj.foo();
</script>
  1. 自执行函数内容this也指向了window
<script>
var a = 10;
function foo(){
(function(){console.log(this.a);}());
}
var obj = {
a:2,
foo:foo
}
obj.foo();
</script>
  1. 闭包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总结

  1. 默认绑定
  2. 隐式绑定
  3. 显示绑定
  4. new绑定

    分别对应了函数的四种调用方式,

    四种调用方式对应了this绑定

    调用方式
  5. 独立调用
  6. 方法调用
  7. 间接调用
  8. 构造方法调用
  • 独立调用 对应 默认绑定
  • 方法调用this指向obj
  • 间接调用通过call()、apply()、bind() 来更改内部的this指向。
  • 构造函数在函数中添加了new关键字,内部中的this会发生改变,它会改变当前的实例化对象。

JS的this指向深入的更多相关文章

  1. JavaScript面向对象(一)——JS OOP基础与JS 中This指向详解

      前  言 JRedu 学过程序语言的都知道,我们的程序语言进化是从"面向机器".到"面向过程".再到"面向对象"一步步的发展而来.类似于 ...

  2. 关于js中this指向的理解总结!

    关于js中this指向的理解! this是什么?定义:this是包含它的函数作为方法被调用时所属的对象. 首先,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定this到底指向谁 ...

  3. Atitit.js this错误指向window的解决方案

    Atitit.js this错误指向window的解决方案 1.1. 出现地点and解决之道1 1.2. call,apply和bind这三个方法2 1.2.1. Function.prototype ...

  4. 前端js中this指向及改变this指向的方法

    js中this指向是一个难点,花了很长时间来整理和学习相关的知识点. 一. this this是JS中的关键字, 它始终指向了一个对象, this是一个指针; 参考博文: JavaScript函数中的 ...

  5. js中this指向的三种情况

    js中this指向的几种情况一.全局作用域或者普通函数自执行中this指向全局对象window,普通函数的自执行会进行预编译,然后预编译this的指向是window //全局作用域 console.l ...

  6. JS中this指向的更改

    JS中this指向的更改 JavaScript 中 this 的指向问题 前面已经总结过,但在实际开中, 很多场景都需要改变 this 的指向. 现在我们讨论更改 this 指向的问题. call更改 ...

  7. 关于js中this指向的总结

    js中this指向问题一直是个坑,之前一直是懵懵懂懂的,大概知道一点,但一直不知道各种情况下指向有什么区别,今天亲自动手测试了下this的指向. 1.在对象中的this对象中的this指向我们创建的对 ...

  8. 面试官问:JS的this指向

    前言 面试官出很多考题,基本都会变着方式来考察this指向,看候选人对JS基础知识是否扎实.读者可以先拉到底部看总结,再谷歌(或各技术平台)搜索几篇类似文章,看笔者写的文章和别人有什么不同(欢迎在评论 ...

  9. 深入理解JS各种this指向问题

    说到this,入前端坑的人都知道这是JS初期语言毕竟之路.很多人(我就是)对于this的了解很模糊,或者不够全面.最近打算在反过来在看下es6,在es6中又出现了箭头函数对于this的理解有多了层认识 ...

  10. javascript函数,构造函数。js对象和json的区别。js中this指向问题

    函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块.好处:在出现大量程序相同的时候,可以封装为一个function,这样只用调用一次,就能执行很多语句.(1)语法:函数就是包裹在花括号中的代码 ...

随机推荐

  1. Hexo准备---Node.js、Vue

    Hexo准备---Node.js.Vue 安装node.js 1.下载node 配置node.js环境官网下载,一直next就好,非常方便. 下载官网: http://nodejs.cn/downlo ...

  2. Python import本地模块

    无法识别本地模块 在pycharm中选择文件夹Mark Directory as -> Source root. 或者使用sys.path.append()添加文件夹路径 还是报错ImportE ...

  3. 关于FFT的一些理解,以及如何手工计算FFT加深理解和验证正确性

    总结缺少逻辑性和系统性,主要便于自己理解和记忆 关于一维FFT的 于是复系数Cn是图像傅里叶变换的yn列向量 于是我们看到最后引入,Cn这个复系数的模来表征频率波的振幅记为Sn(即简谐波叠加的数量 然 ...

  4. 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] ...

  5. bzoj1013球形空间产生器sphere 高斯消元(有系统差的写法

    Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁 ...

  6. js GC & stack heap

    js GC & stack heap stack 栈,函数执行形成执行栈帧,变量名,指针 heap 堆,非结构化的数据(Object),分配的内存的存储空间 js 垃圾回收机制 https:/ ...

  7. alipay 小程序开发教程

    alipay 小程序开发教程 https://opendocs.alipay.com/mini/00ccmd 或访问开放平台:https://opendocs.alipay.com/mini/00cc ...

  8. shit 钉钉

    shit 钉钉 钉钉 圈子 入口, 没有 https://www.dingtalk.com/qidian/help-detail-1000131196.html shit bug 全员圈 这个好像是要 ...

  9. windows10 安装NASM

    NASM官网 下载NASM NASM在线HTML文档 下载golink golink文档 NASM教程 in windows x64调用约定 x86调用约定 编码样式约定 在编写nasm时数字默认为1 ...

  10. iOS 兼容性处理

    1. scroll滑动层,在iOS中滑动不流畅的处理 -webkit-overflow-scrolling:touch; //在滑动层标签添加这个样式 2. iOS 系统中input标签,去掉圆角效果 ...