第二周总结

135 阅读1分钟

1.this指向问题

函数在js内是单独保存在内存中的,变量引用的都是函数地址.函数作为一个独立的值,可以运行在不同的上下文环境(this)下。

js允许函数内部引用当前环境变量,因此不同上下文环境下,同名变量可能有不同的内容。

var f = function () {
  console.log(this.x);
}

var x = 1;
var obj = {
  f: f,
  x: 2,
};

// 单独执行
f() // 1

// obj 环境执行
obj.f() // 2

根据函数运行在全局环境还是obj的环境,x获取到对应环境下改变量的内容。有一点值得注意,严格模式下,独立调用的函数,内部this执行undefined,非严格模式会自动转向window

这是函数的使用,另外还有一个比较独特的obj使用this的例子

var a = 20;
var obj = {
    a: 10,
    c: this.a + 20,
    fn: function () {
        return this.a;
    }
}
 
console.log(obj.c);
console.log(obj.fn());

obj.c输出是40,而obj.fn()输出10,输出10很好理解,因为fn函数的当前上下文环境是obj。但是为什么obj.c输出40,这是因为当obj在全局声明时,无论obj.c在什么地方调用,这里的this都指向全局对象

如果obj不是放在全局会怎么样呢

//'use strict';
var a = 20;
function foo () {
    var a = 1;
    var obj = {
        a: 10, 
        c: this.a + 20,
        fn: function () {
            return this.a;
        }
    }
    return obj.c;
 
}
console.log(foo()); //40
var data = {a:2,foo:foo}
console.log(data.foo())//22

而当obj在函数环境中声明时,这个this指向函数的上下文环境