this指向相关问题-JavaScript(绝对值得弄懂)

code

        <script>
            var num = 100;

            var obj = {
                num: 200,
                inner: {
                    num: 300,
                    print: function () {
                        console.log(this.num);
                    }
                }
            }

            obj.inner.print(); //300

            var func = obj.inner.print;
            func();  //100

            (obj.inner.print)(); //300

            (obj.inner.print = obj.inner.print)(); //100
        </script>

问题

  • 第一个和第三个有什么区别?
  • 第三个和第四个有什么区别?
阅读 3.5k
5 个回答

看了一下答案,大家的主要困惑在于第三个式子。其实很好理解,不要被第二个和第四个绕进去了。

第二个是一个赋值,赋值后的func仅仅是一个函数引用,这个引用丢失了函数原本所在的上下文信息,所以最终是在全局上下文中运行

第四个为什么不行?原因是因为赋值表达式的副作用:赋值表达式会返回等号右边的值!因此整个赋值表达式的结果是一个函数,这个函数同样丢失了它所在的上下文。因此结果与2一样了。如果把等号换成逗号,会得到同样的结果,因为逗号表达式也有相同的副作用。

再看3,3有什么问题?没问题!因为括!号!没!有!副!作!用!你说它会返回一个表达式,表达式就表达式,whatever,单独看第一个式子的括号前面的部分也是一个表达式,不是吗?

1.第一个和第三个没有区别,运行的都是obj.inner.print(),里面的this指向obj.inner.num

2.第四个

首先你要知道一点,复制操作,会返回所赋的值

var a;
console.log(a = 5); //5

所以(obj.inner.print = obj.inner.print)的结果就是一个函数,内容是

function () {
    console.log(this.num);
}

在全局下运行这个函数,里面的this指向的就是window,所以(obj.inner.print = obj.inner.print)();的结果就是

var num = 100;
function () {
    console.log(this.num);
}()
// 100

用《你不懂js》里的方式来解释:
一、三是隐含绑定,this绑定到inner对象上
二、四是默认绑定,this绑定到window对象上

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