普通函数this
- 普通函数this要看
在哪执行的
,怎么执行的。
箭头函数this
- 箭头函数中this指向要看
函数定义时所在的对象
,this指向当前环境的上下文。
call, apply, bind
-
三者都可以修改函数的this指向
-
call
和apply
都是调用后立即执行
,bind
则是不立即执行
。 -
call和apply传入的第二个参数不同,call只能接收单个参数,apply第二个参数必须为数组。
全局作用域
非严格模式和严格模式中this都是指向顶层对象(浏览器中是window
)。
函数作用域
作用域属性是在定义函数
的时候决定的,不是在调用函数
的时候决定。
JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里。
例如:
var a = 100;
var fn1 = function () {
var a = 200;
return function () {
console.log(a);
}
}
var fn2 = fn1();
fn2(); // 200
var a = 100;
var fn1 = function (fn) {
var a = 200;
fn();
}
var fn = function() {
console.log(a)
}
fn1(fn); // 100
var a = 100;
var fn1 = function () {
var a = 200;
var fn = function() {
console.log(a)
}
fn();
}
fn1(); // 200
总结
-
在函数体中,非显式或隐式地简单调用函数时,在严格模式下,函数内的 this 会被绑定到 undefined 上,在非严格模式下则会被绑定到全局对象 window/global 上。
-
一般使用 new 方法调用构造函数时,构造函数内的 this 会被绑定到新创建的对象上。
-
一般通过 call/apply/bind 方法显示调用函数时,函数体内的 this 会被绑定到指定参数的对象上。
-
一般通过上下文对象调用函数时,函数体内的 this 会被绑定到该对象上。
-
在箭头函数中,this 的指向是由外层(函数或全局)作用域来决定的。