Javascript的this指向问题

48 阅读2分钟

this指向什么?

全局作用域下,浏览器中测试则是指向window 但是,开发中很少直接在全局作用于下去使用this,通常都是在函数中使用。

  • 所有的函数在被调用时,都会创建一个执行上下文:
  • 这个上下文中记录着函数的调用栈、AO对象等;
  • this也是其中的一条记录;

有四种绑定规则

  1. 默认绑定
  2. 隐式绑定
  3. 显式绑定
  4. new绑定

一、默认绑定

独立的函数调用。(理解成没有绑定到某个对象上进行调用)

function foo(func){
    func()
}

const obj = {
    name:"jackson",
    bar(){
        console.log(this)
    }
}
foo(obj.bar) //浏览器下打印的是window,严格模式下打印undefined

二、隐式绑定

是通过某个对象发起的函数调用。

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

const obj={
    name:"jackson",
    foo
}

obj.foo(); //打印的是obj对象

三、显式绑定

call、apply、bind的第一个参数即需要绑定的this

四、new绑定

JavaScript中的函数可以当做一个类的构造函数来使用,也就是使用new关键字。 使用new关键字来调用函数是,会执行如下的操作:
1.创建一个全新的对象;
2.这个新对象会被执行prototype连接;
3.这个新对象会绑定到函数调用的this上(this的绑定在这个步骤完成);
4.如果函数没有返回其他对象,表达式会返回这个新对象;

function Person(name){
    console.log(this);
    this.name=name;
}

let p = new Person("jackson");
console.log(p); // jackson

关于面试:

this是什么?(没有new的情况下)

this是call的第一个参数!(通解)

'use strict'

f1()
//等价于
f1.call(undefined)

f2(1)
//等价于
f2.call(undefined,1)

obj.child.f();
f.call(obj.child)

任何普通的函数调用可以利用转换代码 f(p) ===> f.call(undefined, p) o.c.f(p) ===> f.call(o.c, p)

严格模式下,传undefined就是undefined,如果不是,则浏览器决定this改成window,node环境下则为globalthis。

题目一:

var length = 4;  
function callback() {  
console.log(this.length); // => 打印出什么?  
}  
const obj = {  
length: 5,  
method(callback) {  
callback();  //仅仅传递一次,然后调用,不需要管前后(看最近调用的地方)
            //改写 calllback.call(undefined)
            //非严格模式下 :this.length===window.length
            //所以打印的为 4
}  
};  
obj.method(callback, 1, 2);

题目二:

array = [function(){console.log(this)},2]
array[0]()  //打印什么?
            //array.0() ===> 0.call(array)
            // array 为this

题目三:

f=()=>{
    console.log(this)
    }
f()

箭头函数的this取决于上层作用域的this。箭头函数不绑定this!

参考文章:zhuanlan.zhihu.com/p/23804247