this和闭包之间的关系有点迷糊,谁来给我看一下

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
阅读 1.9k
3 个回答

题一: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

第一段代码,所有的i都指向foo中定义的i,其中f1/f2/foo()()的i各自独立;

第二段代码,this始终指向window,因此全程都在操作同一个i,即全局定义的i,初始值100

第一段代码,是闭包的理解
1.f1=foo().f2=foo(),foo执行环境初始化,两个不同执行环境对应的执行变量里i为undefined;
1.foo()()不谈,直接执行这个函数,拿到当前函数产生执行环境里i的值1;
2.f1():创建f1()产生了f1()的执行环境,初始时当前活动对象里i为1,全局作用域在foo函数的作用域链下一层,取不到100;
3.f1():f1()再次创建执行环境,函数执行环境此时变量i,此时i为2。
4.f2():创建f2()产生了f2()的执行环境,当前活动对象里i为1。
两个执行环境,对应里有不同的执行变量,互不干扰

第二段
执行函数时,函数在全局环境下执行,操作的都是全局作用域的i,所以一直累加

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题