JavaScript中this常见的两个坑

JavaScript中this常见的两个坑

JavaScript中的this就像魔法一样,稍有不慎就会走火入魔.......

正确理解this,得从一个概念“执行上下文” 谈起!

何谓执行上下文(Execution Context)?

JavaScript中this常见的两个坑

JavaScript解释器使用执行上下文的概念,执行上下文可以理解为一种“环境”。脚本中每条语句在执行时,其执行上下文都会是以下三种之一:

  1. 全局上下文

    脚本中(非函数中)的代码的执行上下文属于全局上下文。注意在Web开发中每个页面只有一个全局上下文,在作用域上对应全局作用域。

  2. 函数上下文

    在函数中的运行的代码,每个函数都拥有自己的函数上下文。在作用域上对应函数级作用域

  3. eval上下文(隐身的)

    在名为Eval()的内部函数中作为代码执行的文本

在JavaScirpt中,this正是指向当前函数中下在执行的上下文环境,总结起来JavaScript有四种不同的函数调用类型:

  1. 函数调用 alert('请关注')

  2. 方法调用 console.log('教授学苑')

  3. 构造函数调用 new RegExp('带给你快乐的')

  4. 间接调用 alert.call(undefined, '开发知识')

在以上每一项调用中,它都会拥有各自独立的上下文环境,就会造成this所指向意义有所差别。此外,严格模式也会对执行环境造成影响。

坑1 :内部函数中的this指向哪里?

JavaScript中this常见的两个坑

正确输出为:

true

false

NaN

numbers.sum()是一个对象方法调用,故sum的上下文是numbers对象。虽然calculate定义在sum函数内,但不能以为在calculate内this也指向的是numbers。calculate()是一个函数调用(不是方法调用哦!),所以函数调用中的this指向的是全局对象。

JavaScript中this常见的两个坑

使用.call()方法修改执行上下文。

坑2:方法会分离它自身的对象

JavaScript中this常见的两个坑

输出结果:

JavaScript中this常见的两个坑

why?

方法调用如果不依靠对象,那么就是一个函数调用!上面的例子中myCat.logInfo方法被分离出来作为参数传入函数内setTimeout(mycat.logInfo)。当logInfo被作为函数调用时,this 已经指向了全局对象。

可以使用.bind()方法绑定被分离的对象,解决上下文问题!

JavaScript中this常见的两个坑

关注“教授学苑”,期待带给你快乐的开发知识!

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin
avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: