为什么圆括号内的运算符在函数调用中更改为`this`

Why operator inside parenthesis changes `this` in function call(为什么圆括号内的运算符在函数调用中更改为`this`)
本文介绍了为什么圆括号内的运算符在函数调用中更改为`this`的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

谈话很便宜;请给我看代码。

// equals to this.test = "inside window"
var test = "inside window";

function f () {
  console.log(this.test)
};

var obj = {
  test: "inside object",
  fn: f
};

obj.fn();      // "inside object"   --> fine
(obj).fn();    // "inside object"   --> fine
(1, obj).fn(); // "inside object"   --> fine
(obj.fn)();    // "inside object"   --> fine
(0 || obj.fn)(); // "inside window"   --> why?

// reference equality check
console.log(
  f === obj.fn && 
  (obj.fn) === f && 
  f === (1, obj.fn)
); // all equal :/
我读过ydkjs一书,我熟悉调用点和动态绑定,但我不明白为什么最后一个函数调用将上下文作为其上下文;在这个对照实验中,唯一 这被更改为()comma operator,正如您在最后一条语句中看到的那样,comma operator做了一些奇怪的事情。我怀疑它在返回值时执行赋值(因为如果我们执行赋值也会产生相同的结果),但我不确定。

更新:

&&||运算符:(0 || obj.fn)()

推荐答案

给定:

foo.bar()

内部barthis将为foo

(有例外,例如bar是用箭头函数定义的,但在这种情况下不适用)。

给定:

const bar = foo.bar;
bar();

现在已在没有foo上下文的情况下调用了函数,因此this现在是默认对象(在浏览器中为window)。

表达式:(1, foo.bar)计算为右侧。这就是函数。

就像您已将其复制到变量一样,这会在您调用函数之前断开它与对象的连接,因此您将获得相同的效果。

没有赋值,因为您没有涉及变量,但您调用的是表达式的结果,而不是直接调用对象方法。

这篇关于为什么圆括号内的运算符在函数调用中更改为`this`的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

Update another component when Formik form changes(当Formik表单更改时更新另一个组件)
Formik validation isSubmitting / isValidating not getting set to true(Formik验证正在提交/isValiating未设置为True)
React Validation Max Range Using Formik(使用Formik的Reaction验证最大范围)
Validation using Yup to check string or number length(使用YUP检查字符串或数字长度的验证)
Updating initialValues prop on Formik Form does not update input value(更新Formik表单上的初始值属性不会更新输入值)
password validation with yup and formik(使用YUP和Formick进行密码验证)