第2个打印结果为什么是888,还有(obj.inner.print = obj.inner.print)() 这种写法没看懂?

var num = 10;

var obj = {
    num:8,
    inner: {
        num: 6,
        print: function () {
            console.log(this.num);
        }
    }
}
num = 888;
obj.inner.print(); 
var fn = obj.inner.print;
fn(); 
(obj.inner.print)(); 
(obj.inner.print = obj.inner.print)();
阅读 3.4k
3 个回答

我来回答以下最后一个写法:(obj.inner.print = obj.inner.print)();

首选我们需要注意下运算符优先级

由于圆括号的优先级大于函数执行,因此圆括号先执行(obj.inner.print = obj.inner.print),其返回值为函数print本身(print), 然后作为函数被执行(print()),其this指向window

除箭头函数外,谁调用它就this就指向谁,第一个是inner在调用,所以this.num就是inner.num。
第二个fn()等价于window.fn(),所以是windows在调用所以this指向window。window.num

我们知道=号赋值语句的返回值等于右边变量的值,所以(obj.inner.print=obj.inner.print)等价于obj.inner.print指向的函数,然后这个函数直接调用,this指向window。

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