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

浏览器结果:

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值