在对象的创建和执行阶段会发生什么?

时间:2018-08-04 09:16:42

标签: javascript

我创建了一个普通的JavaScript对象,如下所示:

let obj = {
    name : "something",
    print() {
        console.log(this.name);
    }
}
    
let res = obj.print()
console.log(res);

在此示例中,obj有一个名称和一个简单的方法。我从外面调用该方法。之后,我将返回值记录到控制台中,该返回值为 undefined

我不了解对象内幕后发生的事情。请向我解释此代码的创建和执行阶段。

2 个答案:

答案 0 :(得分:1)

在后台,JavaScript解释器在内存中创建一个对象,并通过def get_filters(): """ Asks user to specify a city, month, and day to analyze. Returns: (str) city - name of the city to analyze (str) month - name of the month to filter by, or "all" to apply no month filter (str) day - name of the day of week to filter by, or "all" to apply no day filter """ print('Hello! Let\'s explore some US bikeshare data!') # TO DO: get user input for city (chicago, new york city, washington). HINT: Use a while loop to handle invalid inputs while True: city = input('Which city do you want to explore Chicago, New York or Washington? \n').lower() if city in CITIES: break # TO DO: get user input for month (all, january, february, ... , june) month = get_user_input('All right! now it\'s time to provide us a month name''or just say \'all\' to apply no month filter. \n(e.g.all, january, feburary, march, april, may, june) \n> ',MONTHS) # TO DO: get user input for day of week (all, monday, tuesday, ... sunday) day = get_user_input('One Last thing. Could you type one of the week day you want to analyse?''You can type \'all\' again to apply no day filter. \n(e.g. all, monday, sunday) \n>',DAYS) print('-'*40) return city, month, day 对其进行引用。调用return outside function 时,它引用相同的对象并调用定义的方法。

在方法中,this引用对象本身(obj),并且由JS解释器设置为隐式引用。

最后,您忘记了从obj.print()返回值。因此,没有为obj分配任何内容。请参考以下示例,因为当从函数返回值时,它会正确打印print()的值。

res

答案 1 :(得分:1)

我要写的是您要的“幕后”。不幸的是,这可能会使您感到困惑,而不是让事情变得更清晰,因为JavaScript本身就是一种“不同的”语言。

在JavaScript中,函数是对象。有时甚至称为一流对象。它具有对象具有的所有内容(属性和方法),并且可以进一步调用。不相信我吗?亲自看看:

function abracadabra()
{
  return "this is magic";
}

console.log(abracadabra.name);
console.log(abracadabra.call());

现在,方法仅仅是对象属性所引用的另一个函数。让我们举个例子:

let obj = {
    name : "something",
    print() {
        console.log(this.name);
    }
}

此处obj被定义为具有两个属性的对象。值类型和函数。当您调用obj.print()函数时,会发生以下情况:

  • 该函数被调用。
  • 所谓的函数上下文this设置为调用该方法的对象。您可以使用this访问同一对象的其他属性。

this到底是什么?如前所述,所谓函数上下文可以根据调用函数的方式引用四个不同的对象。

  1. 该函数被称为函数。例如abracadabra() => this指的是全局上下文,默认情况下始终引用该上下文。

全局上下文取决于执行JavaScript的环境。请记住,JavaScript不仅可以在浏览器中运行。它也可以用作服务器端脚本语言。在浏览器中,全局上下文是当前浏览器窗口。不相信我吗?亲自看看:

// We are not in any method, still "this" is available:
console.log(this.toString());

  1. 该函数被称为方法。例如obj.print() => this指向在其上调用方法的对象。我已经在上面进行了描述。

  2. 该函数被称为构造函数。例如new abracadabra() =>创建了一个新的空对象,this引用了它。现在,该函数应使用属性扩展空对象。

  3. 使用其applycall方法调用该函数=> this指的是您作为这些方法的第一个参数传递的内容。

因此,总结起来:真正了解这些东西在JavaScript中的工作方式可能会很棘手。这是因为基本上只存在该语言中的对象和功能。方法看起来像方法,但实际上也只起作用。

要深入了解我,我推荐本书Secrets of the JavaScript Ninja