使用此标识符的函数的javascript作用域规则

使用此标识符的函数的javascript作用域规则,javascript,scope,Javascript,Scope,为了探索javascript范围规则,我编写了以下代码 对于使用此标识符的函数。我期待第二次调用 在person.helloFunk()中打印名字“Marvin”和年龄“very very old”,因为我 在函数对象本身上创建了属性navn和age,但它没有。 相反,它会重复相同的输出“你好,我是zaphod,我42岁”。 那么,为什么这指的是嵌入函数的对象,而不是函数本身(也是一个对象) 您是在函数上而不是在person对象上设置成员。 如果设置person对象的成员,则函数中的“this”

为了探索javascript范围规则,我编写了以下代码 对于使用此标识符的函数。我期待第二次调用 在person.helloFunk()中打印名字“Marvin”和年龄“very very old”,因为我 在函数对象本身上创建了属性navn和age,但它没有。 相反,它会重复相同的输出“你好,我是zaphod,我42岁”。 那么,为什么这指的是嵌入函数的对象,而不是函数本身(也是一个对象)


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

简单的答案是
是动态的,并相对于容器进行解析(
全局|窗口
如果没有其他容器,除非处于严格模式,在这种情况下它是
未定义的

如果您想更改此指向的内容,您可以使用,或者:


不指向函数本身,而是指向调用函数的对象

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

这个
指的是
person
,而不是
sayHello

我认为将一个函数(
sayHello
)作为上下文传递给
调用
apply
bind
确实是个坏主意,也是个坏例子。它应该是函数用作
this
@Ziarno的对象——在本例中,它添加了必要的数据——函数毕竟是JavaScript中的对象
sayHello instanceof Object===true
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());