【问题标题】:Javascript, this pointer returns different values on browser and console [duplicate]Javascript,此指针在浏览器和控制台上返回不同的值[重复]
【发布时间】:2016-06-16 07:15:21
【问题描述】:

我对 JavaScript 有点陌生,所以刚刚学习“this”指针,我尝试使用 apply() 来更改对象的上下文,我在 NodeJS REPL 中运行代码,输出未定义并且未定义。

    var word="Hello";
    var obj={word:"GB"};
    function foo(){return this.word;}
    console.log(foo());
    foo.apply(obj);
    console.log(foo());

我在chrome浏览器中运行同样的,它输出Hello和Hello,使用apply(),输出应该是Hello和GB。

我对这种用法感到困惑。 请帮忙。

【问题讨论】:

  • 不管你执行多少次foo()(包括通过foo.apply(obj)),你永远不会改变this.word的值,那它为什么要返回不同的值呢?
  • this.obj.word 会给你你想要的!
  • 我认为您的困惑来自对Function.prototype.apply 的误解。我建议你仔细阅读文档并尝试console.log(foo.apply(obj))
  • 要了解更多关于 this 键在 js 中的工作原理,请阅读 kyle simpson 的 github.com/getify/You-Dont-Know-JS/blob/master/…

标签: javascript this


【解决方案1】:

console.log 使用Function.apply 调用函数后的值,因为您在使用.apply(CONTEXT) 调用函数时提供this 上下文。

foo.apply(obj); 不会为foo 的后面的invokation 保存this 上下文

var word = "Hello";
var obj = {
  word: "GB"
};

function foo() {
  return this.word;
}
console.log(foo());
console.log(foo.apply(obj));

您可以使用 .bind 并将引用保存在变量中,以便引用的函数始终具有 binded-context

var word = "Hello";
var obj = {
  word: "GB"
};

function foo() {
  return this.word;
}
console.log(foo());
var bar = foo.bind(obj);
console.log(bar());

【讨论】:

  • 我不知道 apply 不会保存上下文。谢谢:)
【解决方案2】:

foo.apply(obj) 确实返回“GB”,但您将 foo() 传递给 console.log

也许您将apply 误认为bind

console.log(foo()); // World
foo = foo.bind(obj);
console.log(foo()); // GB

或者你的方式:

console.log(foo.apply(obj)); // GB

【讨论】:

  • 是的,我希望它以绑定单词的方式工作,谢谢 :)
猜你喜欢
  • 2012-04-02
  • 1970-01-01
  • 2012-07-06
  • 2019-09-22
  • 2020-06-12
  • 2018-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多