所以我正在尝试学习函数式编程,当我返回时我会看到
const profile = {
name: 'qw',
children: [{
name: 'peter',
getName() {
return this.name;
}
}],
getName() {
return this.name;
}
};
const val = profile.getName();
console.log(`output is ${val}`); //I get 'qw' as expected
//However if I try
const val1 = profile.getName;
console.log(`output is ${val1()}`); //I get ''
我不确定为什么不使用'()'会返回不同的结果
答案 0 :(得分:1)
添加到@VLAZ的注释中,const val = profile.getName();
返回调用的结果(this
在profile
上下文中),而const val = profile.getName;
仅引用了getName
profile
。当您调用它时,上下文为window
。
换句话说,profile.getName()
执行(使用正确的this
)而profile.getName
不执行。而且,当上下文为window
const profile = {
name: 'qw',
children: [
{
name: 'peter',
getName() {
return this.name;
}
}
],
getName() {
return this.name;
}
};
const val = profile.getName();
// this is the equivalence of "qw" which is the result of invoking `getName`
console.log(`output is ${val}`); // 'qw'
const val = profile.getName;
// this is the equivalence of:
getName() {
return this.name;
}
// And the context here is the window.
console.log(`output is ${val}`); // ''
答案 1 :(得分:0)
尽管语法简短,getName()
仍然只是一个常规函数,恰好存储在对象中。它不带有对象引用,this
的调用时间/位置/方式如下:
var obj1={
test:"This is obj1",
logTest(){console.log(this.test);}
};
obj1.logTest();
var fun=obj1.logTest;
fun();
var test="This is window"; // in browsers, regular variables on the top-level
fun();
window["test"]="Indeed it is"; // are actually members of window
fun();
this.test="All the same"; // really they are
fun();
var obj2={
test:"This is obj2",
testfun:fun
};
obj2.testfun();
//////////////////////////////////////
console.log("--------");
var boundfun=obj1.logTest.bind(obj1);
boundfun();
var obj3={
test:"This is obj3",
testfun:boundfun
};
obj3.testfun();
但是,最后一部分boundfun()
显示了一种函数对象bind()
的方法,您可以使用它来“预参数化”一个函数,可以设置的第一个参数是{{ 1}}。我还建议检查该页面左侧链接的其他两个方法call()
和apply()
,它们都是关于通过不仅传递其参数,而且还可以自由设置{{1} }。因此,您可以根据需要创建自己的this
:
this
旁注:问题实际上与函数式编程无关,bindthis()
是一个面向对象的概念。因此,您所看到的更像是功能和面向对象编程的一种特殊组合。