我创建了一个普通的JavaScript对象,如下所示:
let obj = {
name : "something",
print() {
console.log(this.name);
}
}
let res = obj.print()
console.log(res);
在此示例中,obj
有一个名称和一个简单的方法。我从外面调用该方法。之后,我将返回值记录到控制台中,该返回值为 undefined 。
我不了解对象内幕后发生的事情。请向我解释此代码的创建和执行阶段。
答案 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
到底是什么?如前所述,所谓函数上下文可以根据调用函数的方式引用四个不同的对象。
abracadabra()
=> this
指的是全局上下文,默认情况下始终引用该上下文。全局上下文取决于执行JavaScript的环境。请记住,JavaScript不仅可以在浏览器中运行。它也可以用作服务器端脚本语言。在浏览器中,全局上下文是当前浏览器窗口。不相信我吗?亲自看看:
// We are not in any method, still "this" is available:
console.log(this.toString());
该函数被称为方法。例如obj.print()
=> this
指向在其上调用方法的对象。我已经在上面进行了描述。
该函数被称为构造函数。例如new abracadabra()
=>创建了一个新的空对象,this
引用了它。现在,该函数应使用属性扩展空对象。
使用其apply
或call
方法调用该函数=> this
指的是您作为这些方法的第一个参数传递的内容。
因此,总结起来:真正了解这些东西在JavaScript中的工作方式可能会很棘手。这是因为基本上只存在该语言中的对象和功能。方法看起来像方法,但实际上也只起作用。
要深入了解我,我推荐本书Secrets of the JavaScript Ninja。