可以说this是属于JavaScript开发中老生常谈的问题了,this的概念可以很简单但是也可以很抽象或者变化多端,当然也面试题的常客了。接下来谈谈自己的一些理解。
基本的this绑定:
function demo1() {
let demo2 = function () {
console.log(this);
demo3();
};
console.log(this);
demo2();
};
function demo3() {
console.log(this);
};
demo1();
控制台打印:
这个例子中无论函数在哪里声明和调用,由于函数调用时函数并未指定任何对象,所以3个输出是都为Window,都默认指向全局。
还有一种严格模式是默认undefined的(函数声明和调用都在严格模式下):
"use strict";
var num = 954;
function demo() {
console.log(this);
console.log(this.num);
};
demo();
控制台打印:
可以看到,函数声明和调用都在严格模式下时,默认绑定的this输出的是undefined,而this.num会报错。
当函数声明和调用都没有在严格模式下时:
var num = 954;
function demo() {
"use strict";
console.log(this);
console.log(this.num);
};
demo();
控制台打印:
可以看到还是同样的结果。
可是当严格模式下调用不在严格模式中的函数,并不会影响this指向,看看下面的例子:
var num = 954;
function demo() {
console.log(this);
console.log(this.num);
};
//用立即执行函数保证在严格模式下调用demo
(function () {
"use strict";
demo();
}());
控制台打印结果:
可以看到输出 Window 跟 954。说明当严格模式下调用不在严格模式中的函数,此时并不会影响this指向。