使用此标识符的函数的 JavaScript 范围规则



我写了以下一段代码来探索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);

您是在函数上设置成员,而不是在 person 对象上设置成员。如果您设置了 thoe person 对象的成员,则函数中的"this"将引用正确的数据。 person.navn = 'Marvin' console.log(person.helloFunk());将打印出"你好,我是马文,我今年 42 岁。

简单的答案是,"因为这是JavaScript应该工作的方式"。 this是动态的,并且相对于容器解析(如果没有其他容器,则global|window,除非在严格模式下,在这种情况下它是undefined)。

如果要更改this指向的内容,可以使用callapplybind

// 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();

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

最新更新