为什么分配功能对象返回空字符串

时间:2019-06-11 16:41:56

标签: javascript

所以我正在尝试学习函数式编程,当我返回时我会看到

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 ''

我不确定为什么不使用'()'会返回不同的结果

2 个答案:

答案 0 :(得分:1)

添加到@VLAZ的注释中,const val = profile.getName();返回调用的结果(thisprofile上下文中),而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()是一个面向对象的概念。因此,您所看到的更像是功能和面向对象编程的一种特殊组合。