this绑定规则的优先级

1.this的默认绑定优先级是最低的。

function foo() {
    
    
    console.log(this);
}

foo()//window

2.this的隐式绑定的优先级是高于默认绑定的。

var obj = {
    
    
    naem: 'why',
    eating: fn
}

obj.eating();// obj


3.this的显示绑定优先级高于隐式绑定。

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


obj.foo()//windwo


// 1.apply / call的显示绑定高于隐式绑定
obj.foo.apply('abc')//abc
obj.foo.call('abc')//abc


// 2.bind的优先级高于隐式绑定
// var bar = obj.foo.bind('abc');
// bar();//这相当于独立函数调用=>abc


// 3.更明显的比较
function foo() {
    
    
    console.log(this);
}

var obj = {
    
    
    name: 'obj',
    foo: foo.bind('aaa')
}

// 这时候的绑定才是真正的公平的  既调到了obj又调到了bind
obj.foo();//foo

4.new高于隐式绑定
var obj = {
    
    
    name: 'obj',
    foo: function () {
    
    
        console.log(this);
    }
}


var f = new obj.foo();//foo
	
5.new高于显示绑定

new关键字不能和apply/call一起使用, 因为call/apply和new都是主动去调用一个函数的,所以是很难放到一起使用的
所以我们只能比较new和bind之间谁的优先级更高


function foo() {
    
    
    console.log(this);
}

var bar = foo.bind('aaaa');

var obj = new bar(); //foo

总结:new绑定 => 显示绑定(apply / call / bind) => 隐式调用(obj.foo()) => 独立函数调用

6.优先级-忽略显示绑定

function foo() {
    
    
    console.log(this);
}

foo.apply('abc');
foo.apply({
    
    })

// apply/call/bind:当传入null/undefined时,自动将this绑定成全局对象

foo.apply(null)//window
foo.call(null)//window

var bar = foo.bind(null)
bar();//window

7.特殊绑定-间接函数引用

// 争论:代码规范 ;

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

var obj2 = {
    
    
    name: 'obj2'
};

// obj2.bar = obj1.foo;
// obj2.bar();
// 会在词法分析的时候 把上面的obj2和函数调用看成是一个整体
// 第一个小括号是把表达式当成一个整体括起来
(obj2.bar = obj1.foo)();

猜你喜欢

转载自blog.csdn.net/xiaoxiannvh/article/details/128928043
今日推荐