javascript this和闭包之间的关系有点迷糊,哪个大神进来看一下
最近在看js的基础相关的知识点,在看到闭包和this的时候发现了问题,哪个大神帮我分析一下,我分析了一下,分析不下去了,第一个我搜了网上的资料,貌似能解释的清楚,但是看到第二个的时候发现又不通了,++i和i++这个我知道,但是函数运行上下文又迷糊了。
题一
var name = "The Window";
var object = {
name: "My Object",
getNameFunc: function() {
return function() {
return this.name;
};
}
getName: function(){
return this.name;
}
};
alert(object.getNameFunc()()); //"The Window" -- 非严格模式下
alert(object.getName()); //"The Object"
我的理解是:在闭包内使用 this 对象将产生一些复杂的行为。this 对象的值基于函数所在的执行环境在运行时决定:在全局函数中使用时,this等于 window (非严格模式)或 undefined (严格模式);而当作为对象的方法调用时, this 等于这个对象。解析:比较getNameFunc和getName前者返回的是一个匿名函数,执行环境是全局,可以进行拆分理解object.getName() = function(){return this.name}很明显这个的执行环境是全局的。后置的执行环境就object对象。
题二
遇到这两个的时候,我又浆糊了,大神看看这两个该怎样分析为好?谢谢。
var i = 100;
function foo() {
var i = 1;
return function() {
console.log(i++);
}
}
var f1 = foo(),f2 = foo();
foo()(); //1
f1(); //1
f1(); //2
f2(); //1
var i = 100;
function foo() {
var i = 1;
return function() {
console.log(this.i++);
}
}
var f1 = foo(),f2 = foo();
foo()(); //100
f1(); //101
f1(); //102
f2(); //103
题一:this 指向调用它的那个对象。object.getNameFunc()() 因为 object.getNameFunc() 返回的是一个方法,假设叫 fun2,等于 fun2(),等于 window.fun2(),所以 this 指向 window。同理 object.getName() this 指向 object。
题二:
第一段代码 首先 f1 f2 foo() 各自独立,执行的时候形成各自的闭包不收影响,是各自作用域中的i,所以 f1 执行几次它对应的 i 加几次,和 f2 的 i 无关。
第二段代码 参照题一,this 指向 window,而全局的 i 即是 window.i,所以f1() f2() f()() 中的 i 其实是同一个,就是 window.i