JavaScript中的this就像魔法一样,稍有不慎就会走火入魔.......
正确理解this,得从一个概念“执行上下文” 谈起!
何谓执行上下文(Execution Context)?
JavaScript解释器使用执行上下文的概念,执行上下文可以理解为一种“环境”。脚本中每条语句在执行时,其执行上下文都会是以下三种之一:
-
全局上下文
脚本中(非函数中)的代码的执行上下文属于全局上下文。注意在Web开发中每个页面只有一个全局上下文,在作用域上对应全局作用域。
-
函数上下文
在函数中的运行的代码,每个函数都拥有自己的函数上下文。在作用域上对应函数级作用域
-
eval上下文(隐身的)
在名为Eval()的内部函数中作为代码执行的文本
在JavaScirpt中,this正是指向当前函数中下在执行的上下文环境,总结起来JavaScript有四种不同的函数调用类型:
-
函数调用 alert('请关注')
-
方法调用 console.log('教授学苑')
-
构造函数调用 new RegExp('带给你快乐的')
-
间接调用 alert.call(undefined, '开发知识')
在以上每一项调用中,它都会拥有各自独立的上下文环境,就会造成this所指向意义有所差别。此外,严格模式也会对执行环境造成影响。
坑1 :内部函数中的this指向哪里?
正确输出为:
true
false
NaN
numbers.sum()是一个对象方法调用,故sum的上下文是numbers对象。虽然calculate定义在sum函数内,但不能以为在calculate内this也指向的是numbers。calculate()是一个函数调用(不是方法调用哦!),所以函数调用中的this指向的是全局对象。
使用.call()方法修改执行上下文。
坑2:方法会分离它自身的对象
输出结果:
why?
方法调用如果不依靠对象,那么就是一个函数调用!上面的例子中myCat.logInfo方法被分离出来作为参数传入函数内setTimeout(mycat.logInfo)。当logInfo被作为函数调用时,this 已经指向了全局对象。
可以使用.bind()方法绑定被分离的对象,解决上下文问题!
关注“教授学苑”,期待带给你快乐的开发知识!
- 我的微信
- 这是我的微信扫一扫
-
- 我的微信公众号
- 我的微信公众号扫一扫
-