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. linux搭建网站

    CentOS 1.安装 yum -y install nginx *或者安装指定版本,版本网址:http://nginx.org/packages/centos/7/x86_64/RPMS/ rpm ...

  2. 生成不带签名(BOM)的UTF8格式的XML

    生成XML的一种方法如下: using System.Xml; private void SaveXML(string savePath) { XmlWriterSettings setting = ...

  3. HEXO添加置顶功能

    使用库:参考 http://wangwlj.com/2018/01/09/blog_pin_post/ 目前已经有修改后支持置顶的仓库,可以直接用以下命令安装.(cmd 到博客根目录,nmp运行) $ ...

  4. Redux Middleware All in One

    Redux Middleware All in One https://redux.js.org/advanced/middleware https://redux.js.org/api/applym ...

  5. LeetCode & linked list bug

    LeetCode & linked list bug add-two-numbers shit test /** * Definition for singly-linked list. * ...

  6. vue & components & props & methods & callback

    vue & components & props & methods & callback demo solution 1 & props & data ...

  7. svg & stroke & style & class

    svg & stroke & style & class svg selected style methods style class, !important fill, st ...

  8. scrapy 运行逻辑

    爬虫的步骤:发送请求获得响应→解析并提取数据→保存数据 我们沿用这个朴素的逻辑去理解scrapy 一.发送请求获得响应 1.爬虫发送请求request到引擎 2.引擎将请求request传递给调度器s ...

  9. 1004 Counting Leaves ——PAT甲级真题

    1004 Counting Leaves A family hierarchy is usually presented by a pedigree tree. Your job is to coun ...

  10. @RestController和@Controller

    1.使用@Controller 注解,在对应的方法上,视图解析器可以解析return 的jsp,html页面,并且跳转到相应页面 若返回json等内容到页面,则需要加@ResponseBody注解 2 ...