2016-07-09 79 views
0

我学习“这个” JS中的窗口时,我有以下代码:为什么上下文是使用“this”关键字在JavaScript

var person1 = { 
    firstName: "John", 
    lastName: "Snow", 

    printName: function(){ 
    console.log(this); 
    } 
} 

var person2 = { 
    firstName: "Aria", 
    lastName: "Stark", 

    printName: function(callbackFunction){ 
    console.log(this); 
    callbackFunction(); 
    } 
} 

person1.printName(); 
person2.printName(person1.printName); 

这段代码的输出是:

PERSON1

PERSON2

窗口

我明白为什么上下文我因此,为什么当我呼叫回调的上下文是窗口而不是person2?

+0

因为'this'值由函数是如何确定所谓'.. callbackFunction'被称为无任何上下文,因此全球('window')返回...... – Rayon

+0

嗨人造丝, 什么我不不明白为什么没有上下文?当person 2是上下文时,我称之为“printName”,为什么当我从“printName”中调用callbackFunction时,上下文不会保留person2? – RiskX

+0

正如我所评论的答案 - _“它们很重要,它们是如何被调用的,而不是它们如何通过......”_ _ _ ['this'](https://developer.mozilla.org/en/docs/Web/ JavaScript/Reference/Operators/this)___ – Rayon

回答

0

callbackFunction你的情况是一个表达式(函数类型),它根据它们被调用的方式取得上下文(如果没有提供上下文,则是上下文的上下文)。

如果你想叫,然后调整它作为

var person1 = { 
 
    firstName: "John", 
 
    lastName: "Snow", 
 

 
    printName: function(){ 
 
    console.log(this); 
 
    } 
 
} 
 

 
var person2 = { 
 
    firstName: "Aria", 
 
    lastName: "Stark", 
 

 
    printName: function(context, callbackFunction){ 
 
    console.log(this); 
 
    callbackFunction.bind(context).call(null); 
 
    } 
 
} 
 

 
person1.printName(); 
 
person2.printName(person1,person1.printName);

在这里,我经过context还,其中callbackFunction应调用的PERSON1的方法。

而在功能person2.printName我绑定上下文到回调函数。

+0

Guru - _“从正在传递的位置获取上下文”_听起来是错误的。它重要的是它们如何被调用,而不是它们如何传递... – Rayon

+0

http://stackoverflow.com/questions/20279484/how - 访问这个正确的这种背景下的回调似乎对我来说是完美的愚蠢..如果你同意,会标志... – Rayon

+1

@Rayon你对这两个评论都是正确的 – gurvinder372

相关问题