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. 1、Django框架目录介绍

    1.windows上安装django pip install django==1.10.3 安装完成后:django-admin.exe 默认存放路径:C:\Users\licl11092\AppDa ...

  2. Mac下anaconda的安装和基本使用

    Mac下anaconda的安装和基本使用 安装 在conda官网下载安装conda. 打开terminal输入conda -V,回车显示conda的版本说明安装成功. 将conda更新到最新版本 co ...

  3. CF1459-C. Row GCD

    CF1459-C. Row GCD 题意: 给出两个整数序列\(a.b\),他们的长度分别为\(n,m\).对于数组\(b\)中的每个数字,让你求出\(gcd(a_1+b_j,a_2+b_j,..., ...

  4. k8s二进制部署 - etcd节点安装

    下载etcd [root@hdss7-12 ~]# useradd -s /sbin/nologin -M etcd [root@hdss7-12 ~]# cd /opt/src/ [root@hds ...

  5. ACM-ICPC 2018 徐州赛区网络预赛 B BE, GE or NE 【模拟+博弈】

    题目:戳这里 题意:A和B博弈,三种操作分别是x:加a,y:减b,z:取相反数.当x或y或z为0,说明该操作不可取,数据保证至少有一个操作可取,给定一个区间(l,k)和原始数字m,如果A和B在n次操作 ...

  6. Splunk监控软件操作

    一.  Splunk公司与产品 美国Splunk公司,成立于2004年,2012年纳斯达克上市,第一家大数据上市公司,荣获众多奖项和殊荣.总部位于美国旧金山,伦敦为国际总部,香港设有亚太支持中心,上海 ...

  7. xss之htmlspecialchars

    源代码: 可以看到是用htmlspecialchars 对get参数message进行处理,但是他默认不对单引号进行处理的. 只对预定义的字符进行处理: & (和号)成为 & &quo ...

  8. Shell 编程快速上手

    Shell 编程快速上手 test.sh #!/bin/sh cd ~ mkdir shell_tut cd shell_tut for ((i=0; i<10; i++)); do touch ...

  9. 微软官方 free 教程 & 教材 ,MVC ,ASP.NET,.NET,

    MVA https://mva.microsoft.com/ebooks free ebooks 微软官方, free, 教程 ,教材,微软官方 free 教程 & 教材,MVC ,ASP.N ...

  10. VSCode 开放式架构的产品实现思路

    VSCode 开放式架构的产品实现思路 https://code.visualstudio.com/ 源码 https://github.com/microsoft/vscode https://gi ...