this关键字在对象内定义的函数中如何正确工作?

时间:2016-09-06 13:45:03

标签: javascript javascript-objects

我在JavaScript语言的OO范例中很新(我来自Java),并且在这个特定情况下,我对这个 param的正确含义有以下疑问。

我有以下代码:

var obj = {

    fn:function(a,b) {
        log(this-);
    }

}

好的,根据我的理解(如果我做错了断言,请纠正我)前面的代码定义了一个 ob 对象,其中包含一个名为 fn 的函数。

首先怀疑:以这种方式做我是在创建这个对象的实例(在内存中创建)还是我只是声明它(作为Java类)?

我认为我在内存中创建了这个对象的特定实例,但我不确定这个......

好的,然后做:

obj.fn(3,4);

这里这个值是我在调用 fn()函数的特定 obj 对象(实例)的标识

我的推理是正确还是我错过了什么?

如果我没有将 fn()函数声明为对象定义,会发生什么?如果我将它直接放入.js文件中会发生什么? 关键字是否已归为全局对象?

1 个答案:

答案 0 :(得分:2)

首先怀疑:是的,你是在内存中创建一个对象

我知道至少 3个规则用于确定关键字的值,所有这些规则都是根据调用函数的调用地点确定的

1)默认绑定:默认情况下, this 绑定到全局对象。

var a = 10; // declared in global scope

function foo(){
 console.log(this.a); // 10
}

foo(); // callsite 

2)隐式绑定:绑定到调用其方法的对象

var a = 10; // global

var obj = {
  a : 20,
  foo : function(){
         console.log(this.a); // 20
        }
  }

obj.foo(); // callsite

3)显式绑定:绑定到您指定的任何对象。    有两种方法可以做到这一点,call()和apply()

var a = 10;

var obj = {
   a : 20
};

function foo(){
   console.log(this.a); // 20
};

foo.call(obj); // bind to obj