首页 > 语言 > JavaScript > 正文

用最简单的方法判断JavaScript中this的指向(推荐)

2024-05-06 15:11:56
字体:
来源:转载
供稿:网友

都说 JavaScript 是一种很灵活的语言,这其实也可以说它是一个混乱的语言。它把 函数式编程 和 面向对象编程 糅合一起,再加上 动态语言 特性,简直强大无比(其实是不能和C++比的,^_^ )。

JS 里的 this

在 function 内部被创建 指向调用时所在函数所绑定的对象(拗口) this 不能被赋值,但可以被 call/apply  改变

目录

* 一个特例
* 开始判断
    * 法则一:对象方法中的this指向对象本身(箭头函数形式的除外)
    * 法则二:多层嵌套函数中的this指向等同于包含该this的最近一个function的this
    * 法则三:箭头函数以及非指向对象方法中的function的情况下this指向window
* 习题集
    * 普通函数中的this
    * 函数执行后返回另外一个函数中的this(普通函数中)
    * 多层嵌套函数中的this(定时器&箭头函数)1
    * 多层嵌套函数中的this(定时器&箭头函数)2

一个特例

在正式开始之前,我们先来说一个特例。

// 构造函数function Student(name) { this.name = name}// 创建小明和小红两个实例var XM = new Student('xiaoming')var XH = new Student('xiaohong')// 输出信息console.log(XM) // Student {name: "xiaoming"}console.log(XH) // Student {name: "xiaohong"}

在构造函数中,this上的值会在创建实例的时候被绑定到新创建的实例上。不适用于下面的判断方法,所以特此说明。

开始判断

下面是一个典型例子,我们的分析从这里开始。

var x = { name: 'bw2', getName1: function() { console.log(this) }, getName2: function() { setTimeout(() => {  console.log(this) },0) }, getName31: () => { console.log(this) }, getName32: function() { return function() {  console.log(this) } }}x.getName1() // {name: "bw2", getName1: ƒ}x.getName2() // {name: "bw2", getName1: ƒ}x.getName31() // Window {stop: ƒ, open: ƒ, alert: ƒ, confirm: ƒ, prompt: ƒ, …}x.getName32()() // Window {stop: ƒ, open: ƒ, alert: ƒ, confirm: ƒ, prompt: ƒ, …}

法则一:对象方法中的this指向对象本身(箭头函数形式的除外)

var x = { name: 'bw2', getName1: function() { console.log(this) }}x.getName1() // {name: "bw2", getName1: ƒ}

法则二:多层嵌套函数中的this指向等同于包含该this的最近一个function的this

箭头函数没有独立的this作用域,所以继续往外层走,走到了getName: function(){}。那么就是他了,this指向等同于这个function内部的this指向。根据法则一,this指向对象本身。

var x = { name: 'bw2', getName2: function() { console.log(this) // 等同于此处的this setTimeout(() => {  console.log(this) // 原始的this位置 },0) }}x.getName2() // {name: 'bw2', getName1: ƒ}            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选