this不同的执行方式有不同的结果

39 阅读1分钟

this指向什么

以下是提取的文字内容,保留原文格式并转换为无序列表:

  • 我们先说一个最简单的,this在全局作用于下指向什么?

  • 这个问题非常容易回答,在浏览器中测试就是指向window

console.log(this); // window
var name = "why";
console.log(this.name); // why
console.log(window.name); // why
  • 但是,开发中很少直接在全局作用域下去使用this,通常都是在函数中使用。

  • 所有的函数在被调用时,都会创建一个执行上下文:

  • 这个上下文中记录着函数的调用栈、AO对象等;

  • this也是其中的一条记录;

image.png

this不同的执行方式有不同的结果

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

// 1. 直接调用这个函数
foo()  // 在浏览器中输出:window(非严格模式)或 undefined(严格模式)

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

// 3. apply调用
foo.apply("abc")  // 输出:String {'abc'} 包装对象

打印结果:

image.png

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

这个的案例可以给我们什么样的启示呢?

    1. 函数在调用时,JavaScript会默认给this绑定一个值;
    1. this的绑定和定义的位置(编写的位置)没有关系;
    1. this的绑定和调用方式以及调用的位置有关系;
    1. this是在运行时被绑定的;

this的绑定规则:

  • 绑定一:默认绑定
  • 绑定二:隐式绑定
  • 绑定三:显示绑定
  • 绑定四:new绑定