this指向-测试小练习

一、独立函数调用练习

var name = 'window'

var person = {
    name: 'person',
    sayName: function () {
        console.log(this.name);
    }
}

function sayName() {
    var sss = person.sayName;
    sss();//window:独立函数调用
    person.sayName();//person:隐式调用
    (person.sayName)();//person:隐式调用
    (b = person.sayName)();//window: 赋值表达式( 独立函数调用)
}

sayName();

二、箭头函数小测验(箭头函数不绑定作用域,this指向找它上层作用域)

var name = 'window'

var obj = {
    foo: function () {
        // obj的花括号只是定义了一个对象本身而已  没有作用域
        // foo的上层作用域是window
    }
}


var person1 = {
    name: 'person1',
    foo1: function () {
        console.log(this.name);
    },
    foo2: () => { console.log(this.name) },
    foo3: function () {
        return function () {
            console.log(this.name);
        }
    },
    foo4: function () {
        return () => {
            console.log(this.name);
        }
    }
}


var person2 = { name: 'person2' }

// person1.foo1();//person1(隐式绑定)
// person1.foo1.call(person2);//person2(显示绑定大于隐式绑定)

// person1.foo2();//window (箭头函数不绑定作用域,上层作用域是全局)
// person1.foo2.call(person2);//window


person1.foo3()();//window(独立函数调用,没有主体)
person1.foo3.call(person2)();//window(独立函数调用,没有主体)
person1.foo3().call(person2);//person2(最终调用返回函数时,使用的是显示绑定)


person1.foo4()();//person1(箭头函数不绑定作用域,上层作用域this是person1)
person1.foo4.call(person2)();//person2(箭头函数不绑定作用域,上层作用域被显示的绑定一个person2)
person1.foo4().call(person2);//person1(箭头函数不绑定作用域,上册找到person1)

三、new绑定、显示和隐式绑定小测验

var name = 'window'

function Person(name) {
    this.name = name;
    this.foo1 = function () {
        console.log(this.name);
    },
        this.foo2 = () => console.log(this.name),
        this.foo3 = function () {
            return function () {
                console.log(this.name);
            }
        },
        this.foo4 = function () {
            return () =>
                console.log(this.name);
        }
}

var person1 = new Person('person1');
var person2 = new Person('person2');

person1.foo1(); //person1(隐式绑定)
person1.foo1.call(person2); //person2(显示高于隐式绑定)


person1.foo2();//person1 - 上层作用域的this是person1(箭头函数不绑定this,上层作用域的this是person1)
person1.foo2.call(person2);//person1 - 上层作用域的this是person1(箭头函数不绑定this,上层作用域的this是person1)



person1.foo3()();//window(独立函数调用)
person1.foo3.call(person2)();//windwo(独立函数调用)
person1.foo3().call(person2);//person2(返回一个独立的函数,显示绑定到person2)

person1.foo4()();//person1
person1.foo4.call(person2)();//person2
person1.foo4().call(person2);//person1

四、this指向综合小测验

var name = 'window'

function Person(name) {
    this.name = name;
    this.obj = {
        name: 'obj',
        foo1: function () {
            return function () {
                console.log(this.name);
            }
        },
        foo2: function () {
            // this = obj
            return () => {
                console.log(this.name);
            }
        }
    }
}

var person1 = new Person('person1')
var person2 = new Person('person2')

person1.obj.foo1()();//window(独立函数调用)
person1.obj.foo1.call(person2)();//window(独立函数调用)
person1.obj.foo1().call(person2);//person2(显示绑定person2)



person1.obj.foo2()();// obj
person1.obj.foo2.call(person2)();// person2(显示绑定)
person1.obj.foo2().call(person2);// obj

上级作用域的理解

// 上层作用域的理解
var obj = {
    name: 'obj',
    foo: function () {
        // 上层作用域是全局
    }
}

function Person() {
    // Person的上层作用域是全局
    this.foo = () => {
        // 上层作用是Person
    }
}

// 对象字面量和{ }块级作用域的区分
// var 定义对象字面量是没有作用域的
// 块级作用域是把代码块括起来,形成的块级作用域
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值