我如何解决“;这个“;我的代码中的对象混淆

How do I address the "this" object confusion in my code

本文关键字:代码 对象 我的 这个 解决 何解决      更新时间:2023-09-26

此代码来自Functional JavaScript一书,第32页:

var a = {name: "a", fun: function(){ console.log(this);}};
a.fun();
var bfun = function(){ console.log(this);};
var b = {name: "b", fun: bfun};
b.fun();

根据这本书,b.fun()应该打印全局对象或其他对象,然而,在我的情况下,它打印的是对象b

这是书中的错别字还是我遗漏了什么?

这是本书中的一个错误,并在勘误表中进行了更正:

这本书声称,以下代码将导致对象:

var bFunc = function () { return this }; 
var b = {name: "b", fun: bFunc};
b.fun();
//=> some global object, probably Window

这是不正确的。事实上,b.fun()返回存储在变量b.this的语义是这样的,即当函数被调用,而不是在定义函数时调用。如果函数使用b.fun()或b'fun'调用,这被设置为b.

作者或编辑注意:这绝对是误导。更多合适的代码段是:

var bObj = {name: "b", fun: function(){ return this }};
bObj.fun();
//=> {name: "b", fun: function (){ return this }}
var bFunc = bObj.fun;
bFunc();
//=> some global object, probably Window

解释案文如下:

好吧,这可能令人惊讶。你看,当一个函数被调用时在对象的上下文中,其this引用指向对象本身。然而,当我后来将bFunc绑定到字段时bObj.fun,调用时其引用已更改为全局对象。在大多数编程语言中提供。。。

bfun(); // logs "Window" (or global object)
b.fun(); // logs "b"

单词this总是指运行函数的对象。

当然,它是全局窗口obejct。请尝试考虑运行时状态。作用域是调用函数的人,而不是表达式。

以下代码将帮助您:

var a = {name: "a", fun: function(){ console.log(this);}};
  a.fun();
  var bfun = function(){ console.log(this);};
  var b = new Function();
      b.name="b";
      b.fun=bfun;
  b.fun();