中秋技巧篇:如何用CSS实现地球和月亮的公转(收藏)

lxf2023-03-12 12:40:01

其他回答《中秋技巧篇:如何用CSS实现地球和月亮的公转(收藏)》中,给大家介绍了怎样用CSS完成地球上和月亮自转。下边本文来给大家掌握js中this偏向难题,有一定的实用价值,感兴趣的小伙伴可以参考一下,希望对大家有一定的助。

中秋技巧篇:如何用CSS实现地球和月亮的公转(收藏)

JS中this偏向难题

信任我,只需记牢文中的7步口决,就能彻底把握 JS 里的this偏向。

先念口决:箭头函数、new、bind、apply 和 call、欧比届点(obj.)、立即启用、没有在函数公式里。

依照口决顺序,只要符合前边某一情景,就可以知道this指向了。

下面依照口决次序对这些开展详细说明,原文中实例编码都运行在ChromeConsole控制面板中。

文尾有精心准备的习题,用以检测学习成效,别忘记试一下~

1. 箭头函数

箭头函数排第一个因为它的this不被更改,而且只要现阶段函数是箭头函数,那样就可以不用看这些标准了。

箭头函数的this要在建立它时表层this的偏向。这儿的核心有两种:

1、建立箭头函数时,就明确表示了它this偏向。

2、箭头函数里的this偏向外层this

因此要记住箭头函数的this就要先了解表层this的偏向,需要继续在表层运用七步口决。

2. new

当使用 new 关键词调用函数时,函数中的 this 一定是 JS 建立的目标。

阅读者很有可能可能会问,“如果采用new重要启用箭头函数,是否箭头函数的this便会被改动呢?”。

大家在控制面板试一下。

func = () => {} 
new func() // throw error

中秋技巧篇:如何用CSS实现地球和月亮的公转(收藏)

从控制面板中可以看到,箭头函数不可以作为对象,因此不能和new一起实行。

3. bind

bind 就是指 Function.prototype.bind() 具体地址:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

数次 bind 时只看第一次 bind 数值

易错题

function func() {
  console.log(this)
}

func.bind(1).bind(2)() // 1

箭头函数中 this 不被改动

func = () => {
  // 这儿 this 偏向在于表层 this,参照口决 7 「没有在函数公式里」
  console.log(this)
}

func.bind(1)() // Window,口决 1 优先选择

bind 与 new

易错题

function func() {
  console.log(this, this.__proto__ === func.prototype)
}

boundFunc = func.bind(1)
new boundFunc() // Object true,口决 2 优先选择

4. apply 和 call

apply()call()的第一个主要参数全是this,区别就是根据apply启用时实参是放进二维数组里的,并且通过call启用时实参是逗号分隔的。

箭头函数中 this 不被改动

易错题

func = () => {
  // 这儿 this 偏向在于表层 this,参照口决 7 「没有在函数公式里」
  console.log(this)
}

func.apply(1) // Window,口决 1 优先选择

bind 函数中 this 不被改动

易错题

function func() {
  console.log(this)
}

boundFunc = func.bind(1)
boundFunc.apply(2) // 1,口决 3 优先选择

5. 欧比届点(obj.)

function func() {
  console.log(this.x)
}

obj = { x: 1 }
obj.func = func
obj.func() // 1

这儿也就不用编码例子箭头函数和 bind 函数的优先越来越高了,感兴趣可以自行试着吧。

6. 立即启用

在函数公式不符合前面的情景,被直接启用时,this将偏向全局对象。用浏览器环境里全局对象是Window,在Node.js环境里是Global

先再来一个典型的例子。

function func() {
  console.log(this)
}

func() // Window

来一个繁杂的事例,外层outerFunc就起一个蒙蔽目地。

function outerFunc() {
  console.log(this) // { x: 1 }

  function func() {
    console.log(this) // Window
  }

  func()
}

outerFunc.bind({ x: 1 })()

7. 没有在函数公式里

没有在函数中的画面,可以分为浏览器<script />标识里,或Node.js的控制模块文档里。

1、在<script />标识里,this偏向Window

2、在Node.js的控制模块文档里,this偏向Module的默认设置导出来目标,其实就是module.exports

非严格模式

严格模式要在ES5所提出的。在ES5标准以前,可能就是是非非严格模式下,this不可能是undefinednull。因此**在一般严格模式下,根据上边七步口决,假如得到this偏向是undefinednull,那样this会偏向全局对象。**用浏览器环境里全局对象是Window,在Node.js环境里是Global

比如下边的代码,在一般严格模式下,this都指向全局对象。

function a() {
  console.log("function a:", this)
  ;(() => {
    console.log("arrow function: ", this)
  })()
}

a()

a.bind(null)()

a.bind(undefined)()

a.bind().bind(2)()

a.apply()

非严格模式下执行结果为:

中秋技巧篇:如何用CSS实现地球和月亮的公转(收藏)

在严格模式下,实行一样的代码进行比较。记牢要一次性把所有编码拷贝到控制面板中,才可以运行在严格模式下(由于第一行 "use strict" 才能对后边的代码起效)。

"use strict"

function a() {
  console.log("function a:", this)
  ;(() => {
    console.log("arrow function: ", this)
  })()
}

a()

a.bind(null)()

a.bind(undefined)()

a.bind().bind(2)()

a.apply()

严格模式下执行结果为:

中秋技巧篇:如何用CSS实现地球和月亮的公转(收藏)

七步口决在严格模式下与非严格模式下全是完善的,只不过是在非严格模式下nullundefined能被转换成全局对象。因此我没有把这一点纳入口决中。

刷题备考

先记诵口决再刷题,“箭头函数、newbindapplycall、欧比届点(obj.)、立即启用、没有在函数公式里”。

1. 下边执行命令后,func.count 数值是多少?

function func(num) {
  this.count  
}

func.count = 0
func(1)

回答

func.count数值 0。

依照口决,func()启用时归属于第 6 类「立即启用」。在一般严格模式下,this偏向全局对象。thisfunc 一点关系都没有,因此 func.count保持一致so easy

2. 下列箭头函数中 this 偏向谁啊?

obj = {
  func() {
    const arrowFunc = () => {
      console.log(this._name)
    }

    return arrowFunc
  },

  _name: "obj",
}

obj.func()()

func = obj.func
func()()

obj.func.bind({ _name: "newObj" })()()

obj.func.bind()()()

obj.func.bind({ _name: "bindObj" }).apply({ _name: "applyObj" })()

回答

// obj
// undefined
// newObj
// undefined
// bindObj

很简易,你学废了吗?

强烈推荐学习培训:JS视频教学

以上就是关于一文解读js中this偏向难题(附编码)的具体内容,大量欢迎关注AdminJS其他类似文章!