JavaScript 函数指向常见误解

题目一:

var obj = {
    say: function () {
        function bar() {
            console.log(this); // 输出结果会是什么????
        }
        bar();  // 直接调用函数
    }
}
obj.say(); 

问:bar函数打印的结果会是什么?

答案: 在 JavaScript无论在任何地方如果直接调用一个函数,那么函数内的this始终指向全局对象,比如浏览器window , nodeglobal

解释下什么叫直接调用?
直接调用 没有任何修饰的,比如对象前缀的,如 xxx对象.bar() 不是对象点这种调用的方式
没有使用Function.prototypecallapply改变函数this指向的的这样的情况
如 有一个 foo 函数, 直接foo()就是直接调用。

引自这本指南中this工作原理
http://bonsaiden.github.io/JavaScript-Garden/zh/#function.general

附上:

题目2:


function Person(name) {
    this.username = name;
    this.say = function () {
        console.log(this.username);
    }
}
const p1 = new Person("sansan");
var fn = p1.say;
fn(); // 输出结果会是多少?

答案是: undefined,此时 fn 函数还是指向全局对象,还是一样会和直接调用函数一样,哪怕你是把一个对象中的方法赋值给一个变量。

总结: this的指向拥有晚绑定的特性,什么是晚绑定呢?指的是this会依具体的调用环境来得出this,简单来说就是,什么时候调用才决定this指向哪里.

Note: 方法通常指对象中的函数,函数则指的是不属于一个对象,直接声明的。

原文地址:https://www.cnblogs.com/xiaolantian/p/12719502.html