我编写了以下代码片段以探索javascript范围规则 对于使用此标识符的函数。我希望第二次调用 person.helloFunk()打印名称“Marvin”和年龄“非常非常老”,因为我 在函数对象本身上创建了navn和age属性,但事实并非如此。 相反,它重复相同的输出“你好,我是zaphod,我42岁”。 那么为什么它指的是函数嵌入的对象而不是函数本身(也是一个对象)?
var sayHello = function() {
return "Hello, I'm " + this.navn + " and I'm " + this.age + " years old.";
}
var person = {navn: 'zaphod', age: 42};
person.helloFunk = sayHello;
console.log(person.helloFunk());
sayHello.navn = 'Marvin';
sayHello.age = 'verry verry old';
console.log(person.helloFunk());
console.log(person.helloFunk.navn);
console.log(person.helloFunk.age);
答案 0 :(得分:1)
您正在设置函数的成员而不是person对象。 如果设置thoe person对象的成员,则函数中的“this”将引用正确的数据。 person.navn ='马文' 的console.log(person.helloFunk()); //将打印出“你好,我是马文,我已经42岁了。”
答案 1 :(得分:0)
简单的答案是"because that is the way JavaScript is supposed to work"。 this
是动态的并且相对于容器(global|window
解析,如果没有其他容器,除非在严格模式下,在undefined
}。
如果您想要更改,this
点可以使用call
,apply
或bind
:
// call and apply differ only in how you pass arguments
// In this case, no arguments, so the invocation is the same
person.helloFunk.call(sayHello);
person.helloFunk.apply(sayHello);
var boundHello = person.helloFunk.bind(sayHello);
boundHello();
答案 2 :(得分:0)
this
不指向函数本身,而是指向调用它的对象。
function sayHello() {
return this.hello;
}
sayHello.hello = "hi!";
console.log(sayHello()); //undefined
当您尝试运行此代码时:
var sayHello = function() {
return "Hello, I'm " + this.navn + " and I'm " + this.age + " years old.";
}
sayHello.navn = 'Marvin';
sayHello.age = 'verry verry old';
var person = {navn: 'zaphod', age: 42};
person.helloFunk = sayHello;
console.log(person.helloFunk());
this
是指person
,而不是sayHello
。