我不明白为什么这段代码会记录“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”?
答案 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的apply
和call
都是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