用`apply()`设置`this`的值

时间:2015-04-19 16:23:43

标签: javascript

我不明白为什么这段代码会记录“Hello world”:

var log = function(){ console.log(this) }
var greeting = function(){ return "Hello world" }
greeting.apply(log)

根据我在apply()上的MDN页面收集的内容,在apply(log)greeting()设置greeting()的{​​{1}}至this,是对的吗?如果是这样,为什么上面的代码会记录“Hello world”?

3 个答案:

答案 0 :(得分:3)

this是一个伪参数,每次调用函数时都会传递给函数。

var person1 = { name: "John" }, person2 = { name: "Maria" };

function f (greeting) { return greeting + ", my name is " + this.name; }

f.apply(person1, ["hi"]) // "hi, my name is John"
f.apply(person2, ["hello"]) // "hello, my name is Maria"

那么当您正常调用它时会发生什么,例如foo();? 嗯,这取决于你是否使用"strict mode"

  • 当不使用“严格模式”时,该函数将接收全局对象(窗口)为this
  • 使用“严格模式”时,该功能会收到未定义this

调整你的例子:

var log = function(){ return "this is log func";  }   
var greeting = function(){ return "Hello world: " + this(); }
greeting.apply(log) // "Hello world: this is log func"

上面的示例有效,因为this设置为 log 函数。由于this实际上是 log ,因此您可以像使用任何其他功能一样玩游戏:

var log = function(){ return "this is " + this.name;  }   
var greeting = function(){ return "Hello world: " + this.apply({name: "Mark"}); }
greeting.apply(log) // "Hello world: this is Mark

答案 1 :(得分:1)

  

从我从apply()上的MDN页面收集的内容,调用apply(log)on   greeting()将greeting()设置为log(),是吗?

不,不是真的。它将greeting的{​​{1}}集this设置为log ...而没有括号。所以log永远不会被召唤。

此外,apply还执行调用它的函数。因此,在您的情况下,greeting.apply(log)只执行函数greeting并将此函数的this设置为log。但是,由于您未在this中使用greeting,因此this并不重要。

答案 2 :(得分:0)

我以为我会用答案扩大我的评论。 Javascript的applycall都是Function.prototype的方法,用于将关键字this的上下文设置为给定对象。

例如。

 var log = function() { console.log(this); };
 log() // this would `console.log` window or the global object
 log.call({example: "value"}); // Object {example: "value"}
 log.apply({example: "value"}) // same thing, but you can pass an array of arguments