gpt4 book ai didi

javascript - 括号如何影响 JavaScript 中的代码?

转载 作者:行者123 更新时间:2023-11-29 10:01:28 38 4
gpt4 key购买 nike

var obj, method;

obj = {
go: function() { console.log(this); }
};

(method = obj.go)()

注意:Fyodor 对他的回答的第一条评论对我帮助最大。正如主题所暗示的,这更多的是关于括号而不是 this

最后一行,我的理解是括号会强制里面的代码先运行,所以methodgo属性的值,也就是一个函数。

() 然后调用该函数,它将 window 记录到控制台,因为它不是作为方法调用的。

如果您执行 method = obj.go() 而不是 (method = obj.go)(),它将首先运行 go 函数,而 method 将采用它返回的值。由于 go 不返回任何内容,因此它将是 undefinedgo 打印的值将是 obj

我不明白的是,为什么如果我执行 (obj.go)() 打印的 thisobj 而不是窗口?

考虑到其他代码的工作方式,我希望这段代码能像这样工作:obj.go 首先在括号内求值,然后该函数作为 IIFE (function() { console.log(this); })() 运行。因此,由于该函数未作为 obj 的方法调用,因此 this 默认为 window

最佳答案

(method = obj.go)()分两步进行评估。

  1. method = obj.go被评估和method var 等于函数 go对象 obj . JavaScript 中的函数可以作为方法或函数调用,因此通常它不会影响您如何定义函数 go .

  2. 然后 method()叫做。因为您没有为 this 提供值(value)(通过调用 method 函数作为某个对象的方法或使用 bindcall 调用时将 this 设置为全局对象(在非严格模式下)或 undefined (在严格模式下)

当您调用 obj.go()this设置为等于 obj (它类似于使用 obj.go.call(obj)method.call(obj) )。如果你只打电话 method() this等于全局对象(类似于调用 obj.go.call(window) )

编辑

并得到obj作为this用你的例子你可以这样做

(method = obj.go.bind(obj))()

通过这种方式,您不仅可以分配 go变量函数 method但创建绑定(bind)到特定 this等于 obj

关于 function invocation and this in JavaScript 的好读物

关于javascript - 括号如何影响 JavaScript 中的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56194514/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com