前端面试题(二)this相关的问题

通过面试题来说明this的使用


循序渐进,从调用函数到this本质。本次实验在浏览器基础上可以实现,直接使用node是不能实现部分内容的(原因是浏览器自动转化的全局对象)

直接调用函数
function get(content){
	console.log(content)
}
get('hello')
// 上述的用法,相当于下面这行代码的语法糖
get.call(window,'hello')  
直接调用对象方法
let name ="Window"
let person ={
	name:"person",
	get:function(){
		console.log(this.name)
	}
}
person.get() // outs: person
// 同理,上述用法为下面代码的语法糖
person.get.call(person) // outs: person

person.get.call(window) // outs: Window

箭头函数的this
  • 箭头函数的this是定义函数时绑定的,而不是执行函数时
  • 箭头函数中this是固定的,本身没有this,内部的this就是外层代码块的this(即继承自父元素的执行上下文)
    • 也是这个原因,箭头函数不能作为构造函数
let x = 111
let obj = {
	x:222,
	say:()=>{
		console.log(this.x)
	}
}
obj.say()   /// 111  
// 因为 定义箭头函数时,父元素的执行上下文为window对象,所以this.x 为111

如何指定对象内部的x呢?

let x= 111
let obj ={
	x:222,
	say:()=>{
		let fn = ()=> console.log(this.x)
		fn()
	}
}
obj.say() // 222
面试题

看一道面试题,巩固一下之前的知识

var name = 222
let  objA = {
    name:111,
    say:function(){
        console.log(this.name)
    }
}
let objB = {
    name:333,
    say:function(fun){
        fun()
    }
}
let fun = a.say
fun() 
objA.say() 
objB.say(objA.say) 
objB.say = objA.say
objB.say() 

变量作用域查看
let 声明的作用域链

题解
var name = 222 // let 声明的不在window对象上(html中处于script 域中)
let  objA = {   // 不能通过作用域链找到,但是可以objA来进行使用,上面同
    name:111,
    say:function(){
        console.log(this.name)
    }
}
let objB = {
    name:333,
    say:function(fun){
        fun()
    }
}
let fun = objA.say
fun()  // => 222  等效于 fun.call(window)   运行时绑定当前this(window)
objA.say()   // 111  等效于 objA.say.call(objA) 
objB.say(objA.say)   // 222  等效于 objB.say.call(objB,objA.say).call(window)
			//  函数运行时绑定执行上下文,运行内部的fun() 时候,上下文为window对象
objB.say = objA.say 
objB.say()  // 333 等效于 objB.say.call(objB)  (objA.say.call(objB))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值