默认绑定 this 与执行上下文?

前提条件

默认绑定、非严格模式

看代码

function foo() {
    var a = 2;
    this.bar();
}

function bar() {
    console.log(this.a);
}

foo();

输出结果

ReferenceError: a is not defined

问题:

  1. this 是在生成执行上下文时产生的 这句话是否正确?
  2. 每执行一个函数创建一个执行上下文,那如下代码,执行obj.foo()时执行上下文是怎样的?
var a = 1;

var obj = {
    a: 2,
    foo: foo
}

function foo() {
    console.log(this.a);
}

obj.foo(); // 2
阅读 2.4k
4 个回答
  1. this 是在生成执行上下文时产生的 这句话是否正确?

正确 (但箭头函数不是这样

  1. 每执行一个函数创建一个执行上下文,那如下代码,执行obj.foo()时执行上下文是怎样的?

可以简单的理解为

var a = 1;

var obj = {
    a: 2,
    foo: function(){
        console.log(this.a);
    }
}

obj.foo(); // 2

foo: foo 只是赋值;this 是函数执行是由谁调用,它就指向谁

  1. this 是在生成执行上下文时产生的 这句话是否正确?

对的,但是箭头函数里面没有this和arguments

第一个题

foo和bar.png

第二个题
第二问的.png


可以看下:https://segmentfault.com/a/11...

obj.foo()
等价于 obj.foo.call(obj)
foo()
等价于foo.call(window)

关键在于你如何理解这段代码

this.bar();

在foo()这个函数作用域中,this是指向window的,你可以理解为深拷贝的window对象。所以bar函数调用的执行上下文依然是window。

推荐问题
宣传栏