为什么,挂钩到对象的函数中的默认上下文本身不是

时间:2016-12-31 11:01:17

标签: javascript design-patterns

在浏览Javascript基础知识时,我了解到this将始终是句点运算符之前的对象,但是

          var ob = {
              x:"",
              setx: function(){
                x = "got u"
                // in this function this is nothing but ob
              }

          }  
         ob.setx();
         console.log(ob.x); // this is giving me still ""
         console.log(x); // getting here as 'got u'
setx中的

this应该包含对象ob的上下文,但是它为什么要访问全局空间而不是访问它自己的x

如果我使用setx,如下所示,则可以使用

               setx : function(){
                 this.x = "got u"
               }

为什么我们必须使用this关键字,即使'getx'上下文绑定到ob对象

我错过了任何基础知识吗?

是否有任何设计模式可以在子功能之间共享数据(应该是私有的)?这样我们就可以重用子函数了。

1 个答案:

答案 0 :(得分:1)

上下文和this是两个不同的东西。

在JS中,你有一个作用域的上下文(从ES6开始你也有块作用域)。这意味着如果已经使用var,let或const实例化变量的相同名称在不同的范围内可以具有不同的值。

this是一个对象引用,您可以在其中存储变量和函数。 它与范围不同。您必须使用this.为所有内容添加前缀,以便将其存储在此内容中。或者从中使用它。

var x = 0; //variable scoped
this.x = 1; //variable on object 

this取决于呼叫站点 - 如何调用函数。

  

从函数调用的调用站点按顺序确定这个   优先。按此顺序提出这些问题,并在第一个时停止   规则适用。

     

是否使用new(新绑定)调用该函数?如果是这样,那就是   新建的物体。

     

var bar = new foo()

     

使用call或apply(显式绑定)调用函数,甚至   隐藏在绑定硬绑定内?如果是这样,这是明确的   指定的对象。

     

var bar = foo.call(obj2)

     

是否使用上下文(隐式绑定)调用函数,否则   被称为拥有或包含对象?如果是这样,那就是上下文   对象

     

var bar = obj1.foo()

     

否则,默认为此(默认绑定)。如果在严格模式下,请选择   未定义,否则选择全局对象。

     

var bar = foo()

     

那就是它。这就是了解此绑定规则所需的全部内容   用于正常的函数调用。嗯......差不多。

您可以在图书You Don't Know JS

中详细了解相关信息