我正在学习被传递的词汇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
}
}
。这是一个常规的非胖箭头函数,这意味着我理解的词汇范围应该停在这里,它不应该更高,但确实如此,我不知道为什么。为什么会这样?
答案 0 :(得分:1)
因为您正在以d.b
方式调用b函数,所以this
是对象d
。因此this.a
相当于d.a
。正如您已经观察到的那样,箭头函数将从其父作用域中携带this
,因此它可以将this.a
解析为d.a
。
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;
如果您将d.b
拉入单独的变量,然后调用它会发生什么?您得到undefined
- 因为this
内的b
现在指的是全局范围。
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;
答案 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
。在箭头函数中,将保留此上下文。