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