this指向什么?
全局作用域下,浏览器中测试则是指向window 但是,开发中很少直接在全局作用于下去使用this,通常都是在函数中使用。
- 所有的函数在被调用时,都会创建一个执行上下文:
- 这个上下文中记录着函数的调用栈、AO对象等;
- this也是其中的一条记录;
有四种绑定规则
- 默认绑定
- 隐式绑定
- 显式绑定
- 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!