JavaScript对象函数和`this`,当未绑定并在表达式/括号中返回时

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaScript对象函数和`this`,当未绑定并在表达式/括号中返回时相关的知识,希望对你有一定的参考价值。

第1-2行和第4-5行对于返回的this有意义。我对第3行缺少什么?我认为它会返回window,类似于第4-5行。这5个模式中是否还有其他模式可以帮助说明原因?

foo =  bar : function ()  return this  

foo.bar() // ==> foo

(foo.bar)() // ==> foo / but why?

(foo.bar ? foo.bar : $.noop)() // ==> window

(foo.bar || 0)() // ==> window
答案

分组运算符不会破坏正在引发method调用的属性引用。

the spec中明确提及的内容:

注意:此算法不适用于GetValue评估Expression。这样做的主要动机是运算符,例如deletetypeof可以应用于括号表达式。

在第4行和第5行中,不是括号,而是取消引用属性并产生“ unbound”函数的运算符(?:||)。

另一答案

foo.bar这是一个匿名函数。

如果将其分成不同的行,可能会更有意义:

foo = 
    bar: function() 
        return this;
    

因此,当您呼叫foo.bar时,您会得到function() return this; 。在第二行,您直接调用该函数(foo.bar()),因此它返回对象对象(this)的实例foo

在第三行,您得到相同的结果,因为您不是only要求匿名函数,而是也要执行该函数:

(foo.bar); // (function()  return this; ); A reference to the function
(foo.bar)(); // (function()  return this; )(); Actually calling the function

因为在后一种情况下,您像在第二行中那样执行函数,所以结果是相同的(foo)。

但是,正如Bergi所说,在第4和第5行中,您使用的运算符从函数中取消引用它们,这给您留下了Window对象而不是foo

以上是关于JavaScript对象函数和`this`,当未绑定并在表达式/括号中返回时的主要内容,如果未能解决你的问题,请参考以下文章

javascript创建对象和方法(this)

JavaScript构造函数和原型原型链及this指向

javascript:函数和对象...?

JavaScript中的this所引用的对象和如何改变这个引用

JavaScript-this指向继承(构造函数和原型对象)

javascript函数中的this的四种绑定形式