为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

holdtom 2019-03-12 17:14:44
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>问题第一个和第三个有什么区别?第三个和第四个有什么区别?
查看完整描述

5 回答

?
慕盖茨4494581

TA贡献1850条经验 获得超11个赞

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

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

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

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


查看完整回答
反对 回复 2019-03-27
?
慕后森

TA贡献1802条经验 获得超5个赞

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


查看完整回答
反对 回复 2019-03-27
?
千巷猫影

TA贡献1829条经验 获得超7个赞

贴个别人家的博客解答,我觉得海星~


查看完整回答
反对 回复 2019-03-27
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

就是首页banner中就有讲的彻底搞懂 JS 中 this 机制


查看完整回答
反对 回复 2019-03-27
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

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


查看完整回答
反对 回复 2019-03-27
  • 5 回答
  • 0 关注
  • 554 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信