在对象内部定义的函数中声明的this关键字究竟如何工作

How exactly work the this keyword declared into a function defined inside an object?

本文关键字:何工作 究竟 关键字 工作 this 内部 对象 定义 函数 声明      更新时间:2023-09-26

我是JavaScript语言中OO范式的新手(我来自Java),我对这个参数在这个特定情况下的正确含义有以下疑问。

我有以下代码:

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

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

第一个疑问:这样做是我创建这个对象的实例(在内存中创建)还是我只是声明它(作为Java类)?

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

好的,然后做:

obj.fn(3,4);

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

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

如果我不将fn()函数声明为对象定义,会发生什么?如果我把它直接放到。js文件中会发生什么?this关键字是否指向全局对象?

第一个疑问:是的,您正在内存中创建一个对象

我知道有至少 3条规则来确定this关键字的值,所有这些规则都是基于调用函数的调用站点来确定的。

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

var a = 10; // declared in global scope
function foo(){
 console.log(this.a); // 10
}
foo(); // callsite 
2)隐式绑定:this绑定到被调用方法的对象
var a = 10; // global
var obj = {
  a : 20,
  foo : function(){
         console.log(this.a); // 20
        }
  }
obj.foo(); // callsite
显式绑定:这个绑定到你指定的任何对象。有两种方法可以做到这一点,call()和apply()
var a = 10;
var obj = {
   a : 20
};
function foo(){
   console.log(this.a); // 20
};
foo.call(obj); // bind to obj