功能(带变量) - >功能 - >胖箭头功能 - >来自第一个功能的变量显示在这里?

时间:2018-05-26 03:48:02

标签: javascript ecmascript-6 arrow-functions

我正在学习被传递的词汇this,我理解一个胖箭从它自己或它上面的函数得到它的“this”。如果这是一个常规函数,我的理解是它不会从高于此的函数中获得function test() { this.a = 5; // test()' variable this.b = function() { //this is a fat arrow function so console log below could grab the this from this function's space, but not higher than this, but it does? this.c = setTimeout(() => { console.log(this.a); }, 1000); } } var d = new test(); d.b();。例如,这是我认为不应该运行的代码:

this.a

所以我希望console.log语句想打印出this.a。它在胖箭头函数上下文中不存在,因此它上升到匿名函数级别一级。这里也没有class Solution { Map<List<Integer>, Integer> map = new HashMap<>(); List<List<Integer>> ret = new ArrayList<>();//Created An ArrayList public void dfs(int index, int target, List<Integer> choosen, int[] nums) { if(choosen.size()==3 && target==0 && !map.containsKey(choosen)){ ret.add(choosen); map.put(choosen,0); for(int j=0;j<list.size();j++) System.out.print(list.get(j)+" "); System.out.println(); //map.put(choosen,0); return; } for(int i=index;i<nums.length;i++) { int x = nums[i]; choosen.add(x); target-=x; dfs(i+1,target,choosen,nums); target+=nums[i]; choosen.remove(choosen.size()-1); } } public List<List<Integer>> threeSum(int[] nums) { List<Integer> choosen = new ArrayList<>(); Arrays.sort(nums); dfs(0,0,choosen,nums); return ret; //Returning Null } } 。这是一个常规的非胖箭头函数,这意味着我理解的词汇范围应该停在这里,它不应该更高,但确实如此,我不知道为什么。为什么会这样?

2 个答案:

答案 0 :(得分:1)

因为您正在以d.b方式调用b函数,所以this是对象d。因此this.a相当于d.a。正如您已经观察到的那样,箭头函数将从其父作用域中携带this,因此它可以将this.a解析为d.a

&#13;
&#13;
function test() {

  this.a = 5; // test()' variable
  this.b = function() {
    console.log("this.a in b: ", this.a);
  
    this.c = setTimeout(() => {
      console.log("this.a in c: ", this.a);
    }, 1000);
  }
}

var d = new test();
d.b();
&#13;
&#13;
&#13;

如果您将d.b拉入单独的变量,然后调用它会发生什么?您得到undefined - 因为this内的b现在指的是全局范围。

&#13;
&#13;
function test() {

  this.a = 5; // test()' variable
  this.b = function() {
    console.log("this.a in b: ", this.a);
    console.log("this === window: ",this === window);
  
    this.c = setTimeout(() => {
      console.log("this.a in c:", this.a);
    }, 1000);
  }
}

var d = new test();
var myNewFunction = d.b;

myNewFunction();
&#13;
&#13;
&#13;

答案 1 :(得分:1)

阅读this(双关语)

“当一个函数作为一个对象的方法被调用时,它的this被设置为调用该方法的对象”

考虑这个简化的例子:

"use strict";

var obj = {
  name: "obj",
  a: function() {
    return this
  }
}
var a = obj.a
var obj2 = {
  name: "obj2"
}
obj2.a = a

console.log(
  obj.a(), // => obj
  a(), // => window | undefined (based on strict mode)
  obj2.a() // => obj2
)

同样,在您的示例中,调用d.b()会在this内将d设置为b。在箭头函数中,将保留此上下文。