博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅谈 js 中的 this 指向问题
阅读量:7106 次
发布时间:2019-06-28

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

this 在前端是一个难点,也是一个痛点。首先this在声明的时候是不确定的,只有在被调用了之后才知道this的指向。主要有一下集中调用方式:复制代码

1: 函数名()直接调用 此时的this指向window

```    function fn() {    	var name = '我是fn里面的name'    	console.log(this.name)    }        var name = '我是window里面的name'        fn()    window.fn()        //  结果    我是window里面的name    我是window里面的name```复制代码

2: window下默认的函数如:setTimeout this也指向window

```    setTimeout(function() {        var name = '我是setTimeout里面的name'        console.log(this.name)    }, 1000)        var name = '我是window里面的name'        //  结果    我是window里面的name```复制代码

3: Object.函数名()的调用 此时的this指向该Object

```    var name = '我是window里面的name'    var obj = {        name: '我是obj里面的name',        getName: function() {            console.log(this.name)        }    }        obj.getName()        var temp = obj.getName    temp()        //  结果    我是obj里面的name    我是window里面的name    (声明一个全局变量temp然后将函数赋值给它,最后通过window调用)var name = '我是window里面的name'    var obj = {        name: '我是obj里面的name',        getName: function() {            console.log(this.name)        }    }        obj.getName()        var temp = obj.getName    temp()        //  结果    我是obj里面的name    我是window里面的name    (声明一个全局变量temp然后将函数赋值给它,最后通过window调用)s```复制代码

4: new运算符中的this指向该实例

```    var name = '我是window里面的name'    function Fn() {        this.name = '我是Fn函数里面的name'        this.getName = function() {            console.log(this.name)        }    }         var fn1 = new Fn()    var temp = fn1.getName        fn1.getName()    temp()        //  结果    我是Fn函数里面的name    我是window里面的name    (声明一个全局变量temp然后将函数赋值给它,最后通过window调用)```复制代码

5: 数组元素为函数时,通过数组来调用函数,此时的this为该数组

```    function yideng(a, b, c) {        console.log(this.length)        console.log(this.callee.length)    }    function fn(d) {    	arguments[0](10, 20, 30, 40, 50)    }    fn(yideng, 10, 20, 30)        // 结果    4    1   (callee是arguments对象的一个属性,指向当前执行的那个函数)```复制代码

6: bind,call,apply 对 this 的重新绑定,this都指向第一个参数

```    function fn() {    	var name = '我是fn里面的name'    	console.log(this.name)    }        var name = '我是window里面的name'        fn()    fn.bind({name: '我是bind里面的name哦'})()   // 注意bind之后返回的是一个函数哦    fn.call({name: '我是call里面的name哦'})    fn.apply({name: '我是apply里面的name哦'})        // 结果    我是window里面的name    我是bind里面的name哦    我是call里面的name哦    我是apply里面的name哦```复制代码

7: 箭头函数中this指向最近一层中的this,不决定于谁调用

```    function fn() {    	var name = '我是fn里面的name'    	console.log(this.name)		function fn2() {			console.log(this.name)		}				fn2()    }        fn.call({name: '我是call里面的name哦'})        //  结果    我是call里面的name哦    我是window里面的name        function fn() {    	var name = '我是fn里面的name'    	console.log(this.name)		var fn2 = () => {			console.log(this.name)		}				fn2()    }        fn.call({name: '我是call里面的name哦'})        //  结果    我是call里面的name哦    我是call里面的name哦```复制代码

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

你可能感兴趣的文章
Sql Server系列:子查询
查看>>
puppet 认证错误:Could not request certificate: unknown message digest algorithm
查看>>
我的友情链接
查看>>
JAVA转义字符
查看>>
[.Net线程处理系列]专题五:线程同步——事件构造
查看>>
struts2学习笔记1
查看>>
Linux mv命令
查看>>
POJ1088 滑雪
查看>>
nginx php有关cgi.fix_pathinfo导致文件类型错误解析漏洞
查看>>
Mysql创建索引
查看>>
flume channel monitor实现源码分析
查看>>
手机 app 开发的几种方式 ionic 学习思路以及 ionic 新建的项目分析
查看>>
MySQL-索引结构详解
查看>>
轻松理解C语言相关的编译器gcc和g++
查看>>
Oracle通过函数进行进制转化
查看>>
opencart smtp服务器 提示 Error: EHLO not accepted from server
查看>>
搭建Apache+tomcat+负载均衡环境
查看>>
原创文章:卷共享和SAN系统的实现原理与应用价值
查看>>
进程同步(OS课件)
查看>>
CentOS yum出现“Could not retrieve mirrorlist ”的解决办法
查看>>