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指向函数的上下文环境