阿里巴巴this指向经典面试题
题目:
var name = 222 var a = { name: 111, say: function () { console.log(this.name) } } var fun = a.say fun() a.say() var b = { name: 333, say: function (fun) { fun() } } b.say(a.say) b.say = a.say b.say()
分析:
在函数调用时,若直接调用,则其内部this则指向window,事实上:
fun (name) { console.log(name) } fun(张三)//此函数调用可等于下列代码 fun.call(window,张三)
即函数即对象,对象必有方法可以调用,而直接调用,则调用者即window,若函数作为对象的方法被调用,则谁调用的,this就指向谁,例如:
name: 李四 var person = { name: 张三 say:function () { console.log(this.name) } } person.say()//say函数被person对象调用,即this指向person,也可以等价于下列代码 person.say.call(person)
本题分析: 1.首先从上往下浏览代码,接着找出每一个函数调用,即一共四个函数调用:
fun() a.say() b.say(a.say) b.say()
2.判度这些函数调用是直接调用还是对象调用,从外
var name = 222 var a = { name: 111, say: function () { console.log(this.name) } } var fun = a.say fun()//相当于fun.call(window)//故this指向window,故输出222 a.say()//相当于a.say.call(a)//this指向a,故输出111 var b = { name: 333, say: function (fun) { fun() } } b.say(a.say) /*形参为函数的,则找出形参函数的调用方式, 该处形参的调用方式为直接调用,则this指向window, 接着找实参函数,因为输出this.name,this又指向window,故 输出222*/ b.say = a.say//函数赋值 b.say() //相当于b.say.call(b),this指向b,故输出b作用域中的name:333
浏览器结果:
上一篇:
Java基础知识总结(2021版)
下一篇:
前端面试题总结---ES6新特性