Javascript 为什么赋值函数对象会返回空字符串

Javascript 为什么赋值函数对象会返回空字符串,javascript,Javascript,所以我正在努力学习函数式编程,当我回来的时候我看到了这一点 const配置文件={ 名称:“qw”, 儿童:[{ 姓名:'彼得', getName(){ 返回此.name; } }], getName(){ 返回此.name; } }; const val=profile.getName(); log(`output is${val}`)//我得到了预期的“qw” //但是如果我尝试 const val1=profile.getName; log(`output is${val1()}`)//

所以我正在努力学习函数式编程,当我回来的时候我看到了这一点

const配置文件={
名称:“qw”,
儿童:[{
姓名:'彼得',
getName(){
返回此.name;
}
}],
getName(){
返回此.name;
}
};
const val=profile.getName();
log(`output is${val}`)//我得到了预期的“qw”
//但是如果我尝试
const val1=profile.getName;

log(`output is${val1()}`)//我得到了“
添加到@VLAZ的注释中,
const val=profile.getName()
返回调用的结果(
概要文件
上下文中),而
const val=profile.getName只引用
profile
中的
getName
。当您调用它时,上下文是
window

换句话说,
profile.getName()
执行(使用正确的
this
),而
profile.getName
不执行。当它出现时,上下文是
window

const配置文件={
名称:“qw”,
儿童:[
{
姓名:'彼得',
getName(){
返回此.name;
}
}
],
getName(){
返回此.name;
}
};
const val=profile.getName();
//这是“qw”的等价形式,它是调用`getName'的结果`
log(`output is${val}`);//qw'
const val=profile.getName;
//这相当于:
getName(){
返回此.name;
}
//这里的上下文是窗口。

log(`output is${val}`);/''尽管语法很短,
getName()
仍然只是一个常规函数,它恰好存储在对象中。它不携带对象引用,
在您调用它时/在何处/如何调用它时进行计算:

var obj1={
测试:“这是obj1”,
logTest(){console.log(this.test);}
};
obj1.logTest();
var fun=obj1.logTest;
乐趣();
var test=“这是窗口”//在浏览器中,顶层的规则变量
乐趣();
窗口[“测试”]=“确实如此”;//实际上是window的成员
乐趣();
this.test=“都一样”//真的吗
乐趣();
var obj2={
测试:“这是obj2”,
测试乐趣:乐趣
};
obj2.testfun();
//////////////////////////////////////
控制台日志(“----------”);
var boundfun=obj1.logTest.bind(obj1);
boundfun();
变量obj3={
测试:“这是obj3”,
testfun:boundfun
};

obj3.testfun()
问题是
并不是指您认为它在
控制台中所做的操作。日志
字符串模板上下文。简言之,在您的第二个代码段
中,此===窗口
,因此您得到的是
窗口。名称
我理解,我只是不确定为什么使用
()
可以帮助我?为什么不是我首先输入的那个呢。@leo检查dupe,但简而言之,
profile.getName()
将有
this===profile
所以
name==“qw”
const val=profile.getName;val()
将与
this===window
一起执行,因此
this.name
将是
window.name
。我的意思是,为什么这指的是window变量@vlazt上下文不会“更改”-它只在调用时设置。因此,当运行
profile.getName()
时,它将在
profile
上下文中调用
getName
。在没有上下文的情况下运行
getName
时(在第二个示例中),上下文设置为
window
。没有变化-
这个
getName
的主体中从来都不是一个具体的东西,它总是在以后确定。很好。JS中的作用域有点棘手。大多数解释都太复杂,而且往往很难完全理解(显然我有一些知识漏洞)。我认为OP的困惑在于调用
getName
getName()
vs
getName