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

时间:2015-01-09 20:59:33

标签: javascript scope

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

3 个答案:

答案 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点可以使用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();

答案 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