【问题标题】:Does the func bike () at the top has been overriden by another function at the bottom顶部的 func bike() 是否已被底部的另一个函数覆盖
【发布时间】:2020-07-24 00:01:25
【问题描述】:
var bike = function() {
  console.log(this.name);
}
var name = "Ninja";
var obj1 = { name: "Pulsar" };
var obj2 = { name: "Gixxer" };

var originalBikeFun = bike;
bike = function() {
  originalBikeFun.call(obj1);
};

bike();           // "Pulsar"
bike.call(obj2);  // "Pulsar"

我需要解释,因为我无法理解。当我将 originalBikeFun 分配给她时,顶部的功能(即自行车)是否被覆盖。这是如何运作的? (顺便说一句,我只复制 mdn 提供的示例)#javascript

【问题讨论】:

  • 是的,它确实被覆盖了。毕竟,你给bike分配了一个新函数。
  • bike = function() { originalBikeFun.call(obj1); }; 是的...
  • bike 只是对某个值的引用。当您将其设置为另一个值时,它将不再指向之前的值

标签: javascript function binding this bind


【解决方案1】:

让我一步一步解释你的代码片段中发生了什么:

  1. 您声明变量bike 并将其分配给它引用此函数:
function() {
  console.log(this.name);
}
  1. 您声明变量 originalBikeFun 并将 reference 分配给上面提到的函数。此时,您有两个变量 bikeoriginalBikeFun,它们仅指向内存中存储函数的一个区域。
  2. 您将这个新函数分配给(取消引用bike 变量:
function() {
  originalBikeFun.call(obj1);
}

此时你有变量bike指向这个函数:

function() {
  originalBikeFun.call(obj1);
}

变量originalBikeFun指向之前分配的函数:

function() {
  console.log(this.name);
}
  1. 当您调用 bike 函数时,这些代码行会执行:
a) originalBikeFun.call(obj1);
b) console.log(this.name);

所以这个调用的结果是“Pulsar”。

  1. 当您调用bike.call(obj2) 时,与之前的函数调用的区别在于您只需将obj2 作为this 指针传递,但是因为在函数bike 中您只有一个重新分配this 指针的调用,所以有没有区别。

【讨论】:

  • 谢谢你!所以这意味着它不会指向前一个,而是她的参考?
  • 这意味着,如果我们谈论对象(文字、函数...),变量总是只存储对这些对象的引用。您可以声明一个函数和多个仅指向该函数的变量。因此,每个指向对象的变量都用作指向内存中某个区域的指针。每个引用操作都会导致对内存中对象的操作。取消引用是指将变量与分配的对象重新分配给一个新对象(现在已经声明或实例化)。
  • :) 努力工作并通过文档学习 JS。请注意,上述内容只是整个有趣的 JS 世界的一小部分。祝你好运,工作富有成效。
猜你喜欢
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-23
  • 2016-11-08
  • 1970-01-01
相关资源
最近更新 更多