JavaScript 函数指向常见误解
题目一:
var obj = {
say: function () {
function bar() {
console.log(this); // 输出结果会是什么????
}
bar(); // 直接调用函数
}
}
obj.say();
问:bar函数打印的结果会是什么?
答案: 在 JavaScript
中无论在任何地方
如果直接调用一个函数,那么函数内的this
始终指向全局对象,比如浏览器
是window
, node
是global
解释下什么叫直接调用?
直接调用
没有任何修饰的,比如对象前缀的,如 xxx对象.bar()
不是对象点这种调用的方式
没有使用Function.prototype
中call
和apply
改变函数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: 方法通常指对象中的函数,函数则指的是不属于一个对象,直接声明的。
我的博客