博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript系列-this详解
阅读量:6696 次
发布时间:2019-06-25

本文共 1844 字,大约阅读时间需要 6 分钟。

Dome

打印对象name值

// 一般方式    var person = {        name : "dengge"    }    function idetify(obj){        return obj.name.toUpperCase();    }    console.log(idetify(person))    // 优化方式    var person = {        name : "dengge"    }    //api 框架    function idetify(){        return this.name.toUpperCase();    }    console.log(idetify.call(person))复制代码

优化方式: 借用call()方法 修改this的指向

当前this指向被调用的对象 优化方式减少了:参数的传递 更易提供一个库调用

this 四个规则

this默认绑定

非严格模式 window 严格模式 undefined

var id = 10; function fn(){    console.log(this.id); } fn() // 10复制代码

fu() == window.fn() 所以当前this指向Window 所以: id -> window.id = 10

非严格模式 window 严格模式 undefined

隐式绑定

如果一个环境调用 走这个环境的this

var id = 10;  var obj = {        id : 20,        fn : function(){            console.log(this.id)        }  }  obj.fn(); // id = 20 (this指向obj)  var fn2 = obj.fn;  fn2(); // 10 (this指向window)  function callback(fn){    fn()  }   callback(obj.fn) //10 (callback -> window, this指向window)复制代码

如果一个环境调用 走这个环境的this

明确绑定

  1. call apply 绑定丢失
    function fn() {    console.log(this.id); } var obj1 = {    id : 30 } var obj2 = {    id : 40 } var obj3 = {    id : 50 } var obj4 = {    id : 60 } fn.call(obj1); // 30 (call使得this指向了obj1) fn.apply(obj2); // 40 (call使得this指向了obj2)复制代码
  2. 硬绑定(bind)
    var fun = fn.bind(obj3);    fun.call(obj1);  // 50 (bind使得this指向了obj3 不会修改成obj1)    fun(); // 50复制代码

new 绑定

// 构造函数function person(){    this.name = "dengge";    return {        a : 1    };}var p = new person();console.log(p.name) // "dengge" (new使得this指向了p对象)复制代码

ES6箭头函数this

function foo() {  setTimeout(() => {    console.log('id:', this.id);  }, 100);}var id = 21;foo.call({ id: 42 }); // id: 42 (如果没有setTimeout(fn(),100) this这时指向window  此时this指向了对象{id:42}  箭头函数没有自己的this,内部的this指向外部的this({id:42}))复制代码

箭头函数里的this是定义时所在的作用域, 而不是运行时所在的作用域 箭头函数没有自己的this,内部的this指向外部的this

转载于:https://juejin.im/post/5a6d79a1518825732739da14

你可能感兴趣的文章
pip升级时报错--- No module named 'pip._internal'
查看>>
大白话搞懂什么是同步/异步/阻塞/非阻塞
查看>>
Fiddler抓包工具总结二(转自小坦克)
查看>>
JSP----动态网页开发的基础
查看>>
CentOS 6.5下部署日志服务器 Rsyslog+LogAnalyzer+MySQL
查看>>
[TFS]安装/升级TFS2012
查看>>
HLG 1408 漩涡
查看>>
径向渐变旋转的圆球
查看>>
LoadRunner使用之变量参数化
查看>>
asp.net运行原理
查看>>
canvas实现芝麻信用评分效果
查看>>
053(五十三)
查看>>
【Spark篇】---Spark中yarn模式两种提交任务方式
查看>>
最短路专题解题报告
查看>>
什么是FSO
查看>>
批处理程序如何接受多个文件拖入?开启了变量延迟enabledelayedexpansion之后遇到感叹号要怎么处理?...
查看>>
java中判断一个字符串是否“都为数字”和“是否包含数字”和“截取数字”
查看>>
Python 3
查看>>
实现主从关系Form中汇总行金额/数量
查看>>
Python学习笔记:协程
查看>>