this的指向

1.this的作用

从某些角度来说,开发中如果没有this,很多问题我们也是有解决方案的
但是没有this,会让我们编写代码变得非常的不方便

var obj100 = {
    name: 'why',
    eating: function () {
        console.log(obj100.name + '在吃东西');
    },
    running: function () {
        console.log(obj100.name + '在吃东西');
    },
    studying: function () {
        console.log(obj100.name + '在学习');
    }
}


var info = {
    name: 'info',
    eating: function () {
        console.log(this.name + '在吃东西');
    },
    running: function () {
        console.log(this.name + '在吃东西');
    },
    studying: function () {
        console.log(this.name + '在学习');
    }
}

2.this在全局作用域指向什么

在大多数情况下,this都是出现在函数中
在全局作用域下
浏览器: window(globalObject)
Node环境:{}

Node 环境中为什么this是一个空对象 :Node会把这个文件当作一个模块去处理
module -> 加载 -> 编译 -> 放到一个函数 -> 执行这个函数.apply({})

console.log(this);

3.同一个函数的this的不同

this指向什么,跟函数所处的位置是没有关系
跟函数被调用的方式是有关系的

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

// 1.直接调用
foo();


// 2.创建一个对象,对象中的函数指向foo
var obj = {
    name: 'why',
    foo: foo
}

obj.foo();


// 3.apply调用
foo.apply("abc");
4.this的绑定规则
1. 绑定一:默认绑定

默认绑定:独立函数调用

案例一:
function foo() {
    console.log(this);
}

foo()//window


案例二:
function foo1() {
    console.log(this);
}

function foo2() {
    console.log(this);
    foo1();
}

function foo3() {
    console.log(this);
    foo2();
}

foo3();//window

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

var bar = obj.foo;
bar();//window

案例四:
function foo() {
    console.log(this);
}

var obj = {
    name: 'why',
    foo: foo
}

var bar = obj.foo;
bar();//window
2. 绑定二:隐式绑定

隐式绑定:Object.fn
Object对象被JS引擎绑定到fn函数中的this里面


// 案例一:
var obj = {
    name: 'why',
    foo: function () {
        console.log(this);
    }
}

obj.foo();


// 案例二:
var obj = {
    name: 'why',
    eating: function () {
        console.log(this.name + '在吃饭');
    },
    running: function () {
        console.log(this.name + '在运动');
    }
}

obj.eating();
obj.running();
3. 绑定三:显示绑定

call和apply在执行函数时,是可以明确的绑定this,这个绑定规则称之为显示绑定

1.call

sum.call('call', 20, 30, 40)
  1. apply
sum.apply('apply', [20, 30, 40])
  1. brind

bind绑定返回一个新的函数对象

function foo() {
    console.log(this);
}
var newFoo = foo.bind('aaaa');
newFoo();
4. 绑定四:new绑定

我们通过一个new关键字调用一个函数时,这个时候this是在调用这个构造器时创建出来的对象
this = 创建出来的对象
这个绑定过程就是new 绑定


function Person(name, age) {
    this.name = name;
    this.age = age

    // 默认return this
}

var p1 = new Person('why', 18)
console.log(p1.name, p1.age);
var p2 = new Person('kobe', 30)
console.log(p2.name, p2.age);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值