快捷搜索: 王者荣耀 脱发

阿里巴巴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

浏览器结果:

经验分享 程序员 微信小程序 职场和发展